Thinking in Java 2nd edition
Revision 3 1
Второ издание 3
Bruce Eckel 3
Читателски отзиви: 4
Bruce Eckel’s Hands-On Java Seminar Multimedia CD
It’s like coming to the seminar!
Available at http://www.BruceEckel.com 15
Конспект 17
Какво има вътре 20
Предговор 1
Предговор към 2ро издание 3
Въведение 5
Необходими начални знания 5
Учене Java 6
Цели 7
Онлайн документация 8
Глави 8
Упражнения 14
Мултимедиен CD ROM 14
Сорс 15
Стандарти при кодирането 16
Версии на Java 17
Семинари и наставничество 17
Грешки 17
Бележка по дизайна на корицата 18
Благодарности 19
За Интернет 21
1: Въведение в обектите 23
Абстракцията 24
Всеки обект си има интерфейс 25
Скриване на код 27
Повторно използване на код 28
Наследяване:
повторно използване на интерфейса 29
Подтискане на функциите на базовия клас 30
Отношенията "е" и "прилича на" 30
Взаимозаменяеми обекти с полиморфизъм 31
Динамично свързване 33
Абстрактни базови класове и интерфейси 33
Обекти и техните времена на живот 34
Колекции и итератори 35
Йерархия с един корен 37
Библиотеки от колекции и поддръжка за лесно използване 38
Downcasting и templates/generics 38
Домакинската дилема:
кой ще чисти? 39
Събирачите на боклук срещу
ефективността и гъвкавостта 40
Обработка на изключенията:
работа с грешките 41
Многонишково изпълнение 42
Упоритост 43
Java и Internet 43
Какво е Мрежата? 43
Клиент/сървър обработки 44
Мрежата е огромен сървър 45
Програмиране на клиентската страна 45
Plug-ins 47
Скриптове и езици за тях 47
Java 48
ActiveX 49
Сигурност 49
Internet срещу Intranet 50
Програмиране при сървъра 51
Отделна арена: приложенията 52
Анализ и проектиране 52
Стоим на курса 53
Фаза 0: Да направим план 53
Фаза 1: Какво ще произвеждаме? 54
Фаза 2: Как ще го направим? 55
Фаза 3: Да строим! 56
Фаза 4: Итерация 56
Планирането се изплаща 58
Java или C++? 58
2: Всичко е обект 61
Обектите манипулираме с манипулатори 61
Трябва вие да създадете всичките обекти 62
Къде живее паметта 63
Специален случай: първични типове 64
Числа с висока точност 65
Масиви в Java 65
Никога не се налага да разрушавате обект 66
Обхвати 66
Обхват на обекти 67
Създаване на нови типове данни: class 68
Полета и методи 68
Стойности по подразбиране за примитивни членове 69
Методи, аргументи и връщани стойности 70
Списъкът аргументи 71
Построяване на Java програма 72
Видимост на имената 72
Използване на други компоненти 73
Ключовата дума static 74
Вашата първа Java програма 76
Коментари и вградена документация 79
Коментар на документацията 79
Синтаксис 80
Вграден HTML 80
@see: отнасяне към други класове 81
Директива за документиране на клас 81
@version 82
@author 82
Директиви за документиране на променлива 82
Директиви за документация на метод 82
@param 82
@return 83
@exception 83
@deprecated 83
Пример за документация 83
Стил на кодиране 84
Резюме 85
Упражнения 85
3: Управление хода на програмата 87
Използваме Java оператори 87
Приоритет 88
Присвояване 88
Aliasing при извикване на методи 90
Математически оператори 91
Унарни минус и плюс оператори 93
Авто инкремент и декремент 93
Оператори за отношение 94
Проверка на еквивалентност на обекти 95
Логически оператори 96
Феноменът short-circuiting 98
Побитови оператори 99
Shift оператори 100
Триместен if-else оператор 103
Операторът запетая 104
String операторът + 104
Обичайни капани при използването на операторите 105
Casting оператори 106
Литерали 107
Разширяване 109
Java няма “sizeof” 109
Приоритетът по нов начин 109
Резюме на операторите 110
Управление на изпълнението 120
true и false 120
if-else 121
return 121
Итерация 122
do-while 123
for 123
Операторът запетая 124
break и continue 125
Безславното “goto” 126
switch 131
Детайли на изчислението 133
Резюме 135
Упражнения 135
4: Инициализация и почистване 137
Гарантирана инициализация с конструктора 137
Пренатоварване на методи 139
Различаване на претоварените методи 141
Претоварването и примитивите 142
Претоварване на връщаните стойности 146
Конструктори по подразбиране 147
Ключовата дума this 148
Викане на конструктори от конструктори 149
Значението на static 150
Почестване: финализация и събиране на боклука 151
За какво е finalize( )? 152
Вие трябва да почистите 153
Как работи събирачът на боклук 157
Инициализация на членове 160
Задаване на инициализация 161
Инициализация в конструкторите 163
Ред на инициализация 163
Инициализация на статични данни 164
Явна инициализация на static 167
Инициализация на нестатични екземпляри 168
Инициализация на масиви 170
Многомерни масиви 174
Резюме 177
Упражнения 178
5: Скриване на реализацията 179
package: библиотечната единица 180
Създаване на уникални имена на пакети 182
Автоматична компилация 185
Колизии 185
Библиотека собствени инструменти 186
Капанът с classpath 188
Използване на импортиране за промяна на поведението 188
Относно пакетите 190
Спецификатори на достъпа в Java 191
“Приятелски” 191
public: интерфейсен достъп 192
Пакетът по подразбиране 193
private: не може да пипате това! 194
protected: “вид приятелски” 195
Интерфейс и реализация 196
Достъп до клас 198
Резюме 200
Упражнения 202
6: Многократно използване на класове 205
Синтаксис на композицията 206
Синтаксис за наследяването 209
Инициализиране на базовия клас 211
Конструктори с аргументи 213
Хващане на изключенията на базовия канструктор 214
Комбиниране на композиция и наследяване 214
Гарантиране на провилно почистване 216
Ред при почистването на боклука 219
Скриване на имената 219
Избиране на композиция
vs. наследяване 220
protected 221
Постъпкова разработка 222
Upcasting 223
Защо “upcasting”? 224
Отново композиция vs. наследяване 225
Ключовата дума final 225
Final данни 225
Празни final 228
Final аргументи 229
Final методи 230
Final класове 230
Final предпазливост 231
Инициализация и товарене на класовете 232
Инициализация с наследяване 233
Резюме 234
Упражнения 235
7: Полиморфизъм 237
Upcasting 237
Защо ъпкастинг? 239
Особеността 241
Свързване при извикването на метод 241
Постигане на точното поведение 242
Разширяемост 245
Подтискане vs. претоварване 248
Абстрактни класове и методи 250
Интерфейси 254
“Многократно наследяване” в Java 257
Разширяване на интерфейс с наследяване 260
Групиране на константи 261
Инициализиране на полета в интерфейсите 263
Вътрешни класове 264
Вътрешни класове и ъпкастинг 266
Вътрешни класове в методи и обхвати 268
Връзката към външния клас 274
static вътрешни класове 276
Обръщения към обект от външния клас 278
Наследяване от вътрешни класове 279
Могат ли вътрешни класове да се подтискат? 280
Идентификатори на вътрешния клас 282
Защо вътрешни класове: рамки на управлението 283
Конструктори и полиморфизъм 290
Ред на извикване на конструкторите 291
Наследяването и finalize( ) 293
Поведение на полиморфни методи в конструкторите 297
Проектиране с наследяване 299
Чисто наследяване vs. разширяване 300
Даункастинг и идентификация на типа по време на изпълнение 303
Резюме 305
Упражнения 306
8: Притежаване на обектите 307
Масиви 307
Масивите са първокласни обекти 309
Колекции от примитиви 312
Връщане на масив 312
Колекции 314
Неудобство: неизвестен тип 314
Понякога работи правилно при всички случаи 316
Правене на Vector чувствителен към типа 318
Параметризирани типове 319
Итератори 319
Типове колекции 323
ArrayList 323
Скапване на Java 323
BitSet 324
Stack 326
Map 327
Създаване на “ключови” класове 332
Properties: тип HashMap 335
Пак енумератори 335
Сортиране 336
Колекциите на Java 2 342
Използване на Collectionи 346
Използване на Listове 350
Използване на Setове 354
Използване на Mapове 357
Избиране на реализация 359
Избор между Listове 360
Избор между Setовете 362
Избор между Mapове 364
Неподдържани операции 368
Сортиране и търсене 370
Arrays 370
Comparable и Comparator 372
Listове 374
Ютилита 376
Правене на Collection или Map неизменяеми 376
Синхронизиране на Collection или Map 378
Резюме 379
Упражнения 380
9: Обработка на грешки чрез изключения 383
Основни изключения 384
Аргументи на изключението 385
Хващане на изключение 386
Блокът try 386
Обработчици на изключения 387
Прекратяване vs. продължаване 387
Специфициране на изключението 388
Хващане на кое да е изключение 389
Преизхвърляне на изключение 391
Стандартни изключения в Java 394
Специалният случай RuntimeException 395
Създаване на ваши собствени изключения 397
Ограничения при изключенията 401
Финализиране с finally 404
За какво е finally? 405
Капан: загубеното изключение 408
Конструктори 409
Търсене на обработчик 413
Правила за изключенията 414
Резюме 415
Упражнения 415
10: Входно-изходна система на Java 417
Вход и изход 418
Типове на InputStream 418
Типове OutputStream 420
Добавяне на атрибути и полезни интерфейси 422
Четене от InputStream
с FilterInputStream 422
Писане в OutputStream
с FilterOutputStream 424
Отделен:
RandomAccessFile 425
Класът File 426
A directory lister 427
Анонимни вътрешни класове 429
Сортиран списък на директорията 430
Проверка за и създаване на директории 432
Типично използване на IO потоци 434
Входни потоци 437
1. Буфериран вход от файл 437
2. Вход от паметта 438
3. Форматиран вход от паметта 438
4. Номериране на редове и файлов изход 439
Изходни потоци 439
5. Запазване и възстановяване на данни 440
6. Четене и писане на файлове с произволен достъп 440
Кратък начин за операции с файлове 441
7. Кратък начин за вход от файл 441
8. Кратък път за форматирано писане във файл 441
9. Начин за писане в даннов файл 442
Четене от стандартния вход 443
Скачени потоци 444
StreamTokenizer 444
StringTokenizer 447
IO потоци на Java 1.1 450
Източници и стоци на данни 451
Променяне на поведението на потоците 452
Непроменени класове 453
Пример 453
Генератор на справки 457
Пренасочване на стандартния IO 459
Компресия 460
Проста компресия с GZIP 461
Много файлове със Zip 463
Java archive (jar) утилитито 466
Сериализация на обекти 468
Намиране на класа 472
Управление на сериализацията 473
Ключовата дума transient 477
Алтернатива на Externalizable 480
Промяна на версиите 483
Използване на устойчивостта 483
Проверка на стила 491
Резюме 499
Упражнения 500
11: Идентификация на типа по време на изпълнение 503
Нуждата от RTTI 503
Обектът Class 506
Класни литерали 508
Проверка преди каст 509
Използване на класни литерали 512
Динамично instanceof 514
Синтаксис на RTTI 516
Рефлексия: информация за клас по време на изпълнение 518
Екстрактор на методите 520
Резюме 524
Упражнения 525
12: Подаване и връщане на обекти 527
Подаване на манипулатори 528
Псевдоними 528
Създаване на локални копия 530
Предаване по стойност 531
Клониране на обекти 532
Правене на клас клонируем 533
Използване на трик с protected 534
Прилагане на интерфейса Cloneable 534
Успешно клониране 535
Ефектът от Object.clone( ) 537
Клониране на композиран обект 539
Дълбоко копиране на ArrayList 542
Дълбоко копиране чрез сериализация 543
Добавяне на клонируемост надолу по йерархията 546
Защо този странен дизайн? 547
Управление на клонируемостта 548
Копи-конструкторът 553
Защо работи в C++ и не работи в Java? 557
Класове само за четене 557
Създаване на класове само за четене 559
Недостатъкът на непроменимостта 560
Неизменяеми Stringове 562
Неявни константи 563
Претоварване на ‘+’ и StringBuffer 563
Класовете String и StringBuffer 565
Stringовете са специални 568
Резюме 568
Упражнения 570
13: Създаване на прозорци и аплети 571
Основният аплет 573
Пускане на аплети от Web браузър 574
Автоматична генерация на HTML файлове 576
Използване на Appletviewer 576
Тестване на аплети 577
Правене на бутон 578
Хващане на събитие 579
Текстови полета 582
Текстови площи 583
Етикети 585
Отметки 587
Радиобутони 588
Падащи списъци 590
Списъчни кутии 591
Пана с ушички 593
Кутии за съобщения 594
Менюта 595
Диалогови кутии 596
Управление на разположението 598
FlowLayout 598
BorderLayout 599
GridLayout 600
GridBagLayout 600
BoxLayout 601
Алтернативи на action 604
Ограничения при аплетите 610
Предимства на аплетите 611
Приложения с прозорци 611
Комбинирано прибожение/аплет 613
Менюта 614
Диалогови кутии 618
Файлови диалози 622
Моделът на събитията 624
Типове събития и слушатели 626
Използване на слушателски адаптери за простота 630
Правене на прозорци и аплети 631
Правене на анонимен клас слушател на прозорец 634
Пакетиране на аплет в JAR файл 634
Преразглеждане на по-раншните примери 635
Демонстриране методите на рамката 635
Текстови полета 636
Текстови полета 639
Отметки и радиобутони 642
Падащи списъци 644
Списъци 646
Менюта 648
Диалогови кутии 653
Избиране на изглед и усещане 656
Свързване на събитията динамично 658
Отделяне на основната логика от UI логиката 661
Препоръчвани подходи при кодирането 664
Чертата: добрият начин да го правите 664
Реализиране на главния клас като слушател 666
Смесване на подходите 668
Наследяване на компонент 669
Грозен интерфейс на компонент 675
JFC APIта 681
Цветовете 682
Печатане 682
Печатане на текст 688
Печатане на графика 688
Стартиране на Frameове в аплети 689
Джобът 690
Теглене и Пускане 693
Визуално програмиране и Bean-ове 701
Какво е Bean? 702
Извличане на BeanInfo
с Introspector 704
По-усложнен Bean 710
Пакетиране на Bean 714
По-сложна поддръжка за Bean 715
Повече за Beans 716
Въведение в Swing 717
Ползите от Swing 717
Лесно преобразуване 718
Работна рамка за дисплей 720
Хвърчащи подсказки 721
Ограничителни линии 721
Бутони 722
Групи бутони 723
Икони 725
Менюта 727
Изскачащи менюта 731
Списъчни кутии и комбинирани кутии 733
Плъзгачи и ленти за напредъка 734
Дървета 735
Таблици 737
Панели с ушички 739
Още Swing 741
Използване на URLове от аплет 742
Четене на файл от сървър 744
Инструмент за оглед на методите 745
Резюме 750
Упражнения 750
14: Много нишки 753
Отговарящ потребителски интерфейс 753
Наследяване от Thread 756
Нишковост за отговарящ интерфейс 758
Подобряване на кода с вътрешен клас 760
Комбиниране на нишката с главния клас 763
Правене на много нишки 765
Нишки-демони 769
Споделяне на ограничени ресурси 771
Неправилно ползване на ресурси 771
Как Java споделя ресурси 776
Синхронизиране на броячите 777
Синхронизирана ефективност 781
Java Beans разгледани пак 781
Блокиране 786
Как се блокира нишка 787
Спане 789
Спиране и продължаване 790
Чакай и бъди уведомен 791
Блокиране по IO 794
Тестване 795
Мъртъв блокаж 797
Остарялост на stop( ), suspend( ),
resume( ) и destroy( ) в Java 2 797
Приоритети 802
Групи нишки 807
Управление на групите нишки 809
Runnable отново 814
Твърде много нишки 817
Резюме 820
Упражнения 822
15: Разпределена обработка 825
Идентификация на машина 825
Сървъри и клиенти 827
Тестване на програми без мрежа 828
Port: уникално място в машината 828
Socket-и 829
Прости сървър и клиент 830
Обслужване на много клиенти 835
Датаграми 841
RMI (Remote Method Invocation) 848
Отдалечени интерфейси 848
Реализация на отдалечен интерфейс 849
Установяване на регистъра 850
Създаване на стубове и скелетони 852
Използване на отдалечения обект 853
Въведение в CORBA 854
Основи на CORBA 854
Interface Definition Language (IDL) на CORBA 855
Услуга за имената 856
Пример 856
Написване на IDL сорса 857
Създаване на стъбове и скелетони 857
Реализация на сървъра и клиента 857
Някои услуги на CORBA 859
Активиране на процеса на службата за имената 861
Активиране на сървъра и клиента 861
Java аплети и CORBA 861
CORBA vs. RMI 862
Jini: разпределени услуги 862
Jini в контекст 862
Какво е Jini? 863
Как работи Jini 864
Процесът discovery 864
Процесът на присъединяване 865
Процесът на преглеждане 865
Разделяне на интерфейса и реализацията 866
Абстракция на разпределени системи 867
JavaSpaces 868
Резюме 868
Упражнения 868
16: Програмиране за фирмата 871
Java Database Connectivity (JDBC) 872
Каране примера да работи 875
Стъпка 1: Намиране JDBC драйвера 875
Стъпка 2: Конфигуриране на базата данни 875
Стъпка 3: Проба на конфигурацията 876
Стъпка 4: Генерация на SQL поръчка 877
Стъпка 5: Променете и вмъкнете запитването си 878
GUI версия на преглеждащата програма 878
Защо API-то на JDBC
изглежда така сложно 881
Сървлети 882
Основния сървлет 883
Java Server Pages 885
Основни операции 885
Вграждане на блокове код 886
Извличане на полета и стойности 886
Манипулиране на сесиите в JSP 887
Създаване и промяна на Cookies 888
Предаване управлението на други сървлети 889
RMI във фирмата 890
Corba във фирмата 890
Enterprise Java Beans (EJB) 890
Защо ни трябва EJB? 891
Как да сложа ‘E’-то на съществуващите мои JavaBeans? 892
Компоненти в Enterprise Java Beans 893
EJB Сървър 893
EJB Container 893
Enterprise JavaBeans 893
Session Beans 894
Entity Beans 894
Bean Managed Persistence 894
Container Managed Persistence 895
Bean Managed vs. Container Managed Persistence 895
Описатели на разгръщането 897
JNDI 897
JTA/JTS 897
CORBA 898
Ролите на Enterprise Java Beans 898
Доставчик на Enterprise Bean-овете 898
Монтажник на приложенията 898
Deployer 899
EJB Server/Container доставчик 899
Системен администратор 899
Разработване с Enterprise Java Beans 899
Разработка на прост Stateless Session Bean 900
Разработка на прост Stateful Session Bean 900
Разработка на BMP Entity Bean 900
Разработка на CMP Entity Bean 900
Дискусионни въпроси, интересни проблеми и литература 900
Защо толкова много правила? 900
Какво не е дефинирано в EJB спецификацията 900
Други позовавания 901
Достъп до цялостни услуги 901
Java Naming and Directory Interface (JNDI) 901
Java Messaging Service (JMS) 901
JavaMail 901
Сигурност във фирмата 901
Резюме 901
Упражнения 902
17: Шаблони за проектиране 903
Концепцията за шаблон 903
Синглетонът 905
Класификация на шаблоните 906
Фабрики: капсулиране създаването на обекти 907
Полиморфни фабрики 909
Абстрактни фабрики 912
Шаблонът "наблюдател" 915
Симулиране на рециклатор 918
Подобряване на дизайна 922
“Прави още обекти” 922
Шаблон за създаване на прототипи 925
Trash подкласове 929
Информация за Trash от външен файл 931
Рециклиране с прототипиране 934
Абстракция на използването 935
Многократно диспечиране 939
Реализация на двойното диспечиране 940
Шаблонът “посетител” 946
Повече сдвояване? 953
RTTI считана вредна? 954
Резюме 957
Упражнения 958
A: Java Native Interface (JNI) 961
Java Native Interface 961
Викане на нативен метод 962
Генератор на C хедъри: javah 963
Сигнатури на функциите; имената 964
Прилагане на ваша DLL 964
Достъп до JNI функции:
аргументът JNIEnv 965
Достап до Java стрингове 966
Подаване и използване на Java обекти 966
JNI и изключенията в Java 968
JNI и тредингът 969
Използване на съществуващ код 970
Пътят на Microsoft 970
B: Насоки за програмиране на Java 971
C: Препоръчва се за четене 977
Индекс 979
Bruce Eckel’s Hands-On Java Seminar Multimedia CD
It’s like coming to the seminar!
Available at http://www.BruceEckel.com 993