Nauka Javy
Wprowadzenie
do tworzenia aplikacji do rzeczywistych zastosowań
Twórcy
Javy od początku historii tego języka śmiało wprowadzali kolejne
awangardowe innowacje, a pisane w niej aplikacje miały swój
udział w napędzaniu internetowego postępu. Obecnie Java jest uważana za
najpopularniejszy język programowania na świecie, a miliony
deweloperów wciąż tworzą za jej pomocą oprogramowanie dla
niemal każdego urządzenia wyposażonego w procesor. Java jest wyjątkowo
wszechstronnym narzędziem: pozwala napisać zarówno prostą
aplikację mobilną, jak i złożony system internetowy. Pozostaje przy tym
stosunkowo prosta w nauce - co sprawia, że jest idealnym językiem dla
początkujących, którzy mają ambicję dojścia do
profesjonalnego poziomu.
Ta książka jest
praktycznym przewodnikiem dla każdego, kto chce zdobyć doświadczenie w
tworzeniu rzeczywistych aplikacji w Javie.
To
również znakomity kurs programowania obiektowego dla
początkujących, umożliwiający gruntowne zrozumienie podstaw języka Java
i jego interfejsów API. Wyczerpująco opisano tu biblioteki
klas, techniki programowania oraz idiomy. Nie zabrakło zaawansowanych
zagadnień, takich jak wyrażenia lambda czy serwlety. W tym przejrzanym
i zaktualizowanym wydaniu ujęto zmiany wprowadzone zarówno w
wersji 11 Javy, jak i w przeglądowych wersjach 12, 13 i 14.
Przedstawiono więc takie nowości jak interferencja typów w
typach sparametryzowanych, ulepszenia w obsłudze wyjątków
czy nowe środowisko testowe jshell.
W książce między innymi:
- przygotowanie środowiska
pracy i konfiguracja przydatnych narzędzi
- typy, instrukcje,
wyrażenia oraz obiekty w Javie
- obsługa wątków
i pakiet współbieżności Javy
- błędy i wyjątki
- interfejs API wyrażeń
regularnych
- tworzenie zaawansowanych
aplikacji i usług sieciowych
Przedmowa
11
1.
Nowoczesny
język 17
Java 17
Pochodzenie Javy 18
Okres dojrzewania 19
Maszyna wirtualna 20
Java a inne języki programowania 23
Bezpieczeństwo projektowania 26
Upraszczaj, upraszczaj i jeszcze raz upraszczaj 26
Bezpieczeństwo typów i wiązanie metod 27
Realizacja przyrostowa 28
Dynamiczne zarządzanie pamięcią 28
Obsługa błędów 29
Wątki 30
Skalowalność 30
Bezpieczeństwo implementacji 31
Weryfikator 32
Ładowarka klas 33
Zarządca bezpieczeństwa 34
Bezpieczeństwo na poziomie aplikacji i użytkownika 35
Harmonogram Javy 35
Przeszłość: Java 1.0 - Java 11 36
Teraźniejszość: Java 14 38
Przyszłość 39
Dostępność 40
2.
Pierwsza
aplikacja 41
Narzędzia i środowisko Javy 41
Instalowanie JDK 42
Instalowanie OpenJDK w systemie Linux 43
Instalowanie OpenJDK w systemie macOS 43
Instalowanie OpenJDK w systemie Windows 44
Konfigurowanie środowiska IntelliJ IDEA i tworzenie projektu 46
Uruchomienie projektu 50
Pobieranie przykładów kodu 51
HelloJava 51
Klasy 54
Metoda main() 55
Klasy i obiekty 56
Zmienne i typy klasowe 56
HelloComponent 57
Dziedziczenie 58
Klasa JComponent 59
Relacje i szukanie winnego 59
Pakiety i importowanie 60
Metoda paintComponent() 62
HelloJava2: drugie podejście 63
Zmienne instancyjne 64
Konstruktory 65
Zdarzenia 67
Metoda repaint() 69
Interfejsy 70
Żegnaj i ponownie witaj 71
3.
Narzędzia
pracy 73
Środowisko JDK 73
Maszyna wirtualna Javy 74
Uruchamianie aplikacji Javy 74
Właściwości systemowe 76
Ścieżka klas (classpath) 76
Narzędzie javap 78
Moduły 78
Kompilator Javy 78
Natychmiastowe sprawdzanie działania kodu Javy 80
Pliki JAR 85
Kompresja plików 85
Narzędzie jar 86
Narzędzie pack200 88
Czas przygotowań 89
4.
Język
Java 91
Kodowanie tekstu 92
Komentarze 94
Komentarze javadoc 94
Zmienne i stałe 96
Typy 98
Typy proste 99
Typy referencyjne 103
Inferencja typów 104
Przekazywanie referencji 105
Kilka słów na temat obiektów String 106
Instrukcje i wyrażenia 106
Instrukcje 107
Wyrażenia 115
Tablice 120
Typy tablicowe 121
Tworzenie i inicjowanie tablicy 121
Używanie tablic 123
Tablice anonimowe 125
Tablice wielowymiarowe 125
Typy, klasy i tablice, o rany! 127
5.
Obiekty w Javie 129
Klasy 129
Deklarowanie klas i tworzenie ich instancji 131
Uzyskiwanie dostępu do pól i metod 132
Składowe statyczne 137
Metody 139
Zmienne lokalne 140
Przesłanianie 141
Metody statyczne 142
Inicjowanie zmiennych lokalnych 144
Przekazywanie argumentów i referencje 145
Klasy opakowujące dla typów prostych 146
Przeciążanie metod 148
Tworzenie obiektów 149
Konstruktory 150
Praca z konstruktorami przeciążonymi 151
Niszczenie obiektów 152
Mechanizm odzyskiwania pamięci 153
Pakiety 154
Importowanie klas 154
Pakiety niestandardowe 156
Widoczność i dostępność składowych 157
Kompilowanie pakietów 159
Zaawansowane projektowanie klas 160
Tworzenie podklas i dziedziczenie 160
Interfejsy 165
Klasy wewnętrzne 167
Anonimowe klasy wewnętrzne 168
Organizowanie zawartości i uwzględnianie występowania błędów
170
6.
Obsługa
błędów i rejestrowanie 173
Wyjątki 174
Klasy błędów i wyjątków 174
Obsługa wyjątków 176
Bąbelkowanie 179
Ślady stosu 180
Wyjątki sprawdzane i niesprawdzane 181
Rzucanie wyjątków 182
Kłopotliwe try 185
Klauzula finally 186
try-with-resources 186
Kwestie związane z wydajnością 188
Asercje 188
Włączanie i wyłączanie asercji 189
Używanie asercji 190
API rejestrowania 191
Przegląd 191
Poziomy rejestrowania 193
Prosty przykład 194
Właściwości konfiguracyjne rejestrowania 195
Klasa Logger 197
Wydajność 197
Wyjątki w praktyce 198
7.
Kolekcje
oraz typy i metody sparametryzowane
199
Kolekcje 199
Interfejs Collection 200
Typy kolekcji 201
Interfejs Map 202
Ograniczenia typów 204
Kontenery, czyli budowanie lepszej pułapki na myszy 205
Czy kontenery można naprawić? 206
Wprowadzenie do typów i metod sparametryzowanych 206
Kilka słów o typach 209
"Łyżka nie istnieje" 210
Wymazywanie 210
Typy surowe 212
Relacje typów sparametryzowanych 213
Dlaczego Listnie jest typem List? 215
Rzutowania 216
Konwertowanie między kolekcjami a tablicami 217
Iterator 217
Działanie metody sort() 218
Aplikacja: drzewa na planszy 219
Podsumowanie 220
8.
Praca
z tekstem i podstawowe narzędzia
223
Łańcuchy znaków - klasa String 223
Konstruowanie łańcuchów znaków 224
Tekstowe reprezentacje z różnych elementów 225
Porównywanie łańcuchów znaków 226
Wyszukiwanie 227
Podsumowanie metod klasy String 227
Różne elementy z tekstowych reprezentacji 229
Parsowanie liczb prostych 229
Tokenizacja tekstu 230
Wyrażenia regularne 232
Notacja wyrażeń regularnych 232
Interfejs API java.util.regex 238
Narzędzia matematyczne 242
Klasa java.lang.Math 243
Duże i dokładne liczby 246
Daty i godziny 248
Lokalne daty i godziny 248
Porównywanie oraz zmiana dat i godzin 249
Strefy czasowe 250
Parsowanie i formatowanie dat i godzin 251
Błędy parsowania 253
Znaczniki czasu 254
Inne przydatne narzędzia 254
9.
Wątki
257
Wprowadzenie do wątków 258
Klasa Thread i interfejs Runnable 258
Sterowanie wątkami 261
"Śmierć" wątku 266
Synchronizacja 268
Szeregowanie dostępu do metod 268
Uzyskiwanie dostępu do zmiennych klasowych i instancyjnych z wielu
wątków 273
Planowanie i priorytety 274
Stany wątku 275
Podział czasu 276
Priorytety 277
Oddawanie sterowania 278
Wydajność wątków 279
Koszt synchronizacji 279
Wykorzystywanie zasobów wątku 279
Narzędzia do obsługi współbieżności 280
10.
Aplikacje
desktopowe 283
Przyciski, suwaki oraz pola tekstowe, o rety! 284
Hierarchie komponentów 284
Architektura Model-Widok-Kontroler 284
Etykiety i przyciski 286
Komponenty tekstowe 292
Inne komponenty 299
Kontenery i układy 303
Ramki i okna 303
Klasa JPanel 305
Menedżery układu 306
Zdarzenia 314
Zdarzenia myszy 315
Zdarzenia działań 318
Zdarzenia zmian 320
Inne zdarzenia 321
Okna modalne i wyskakujące okienka 322
Okna dialogowe z komunikatami 322
Okna dialogowe z potwierdzeniem 325
Okna dialogowe z danymi wejściowymi 326
Rozważania na temat obsługi wątków 326
Klasa SwingUtilities i aktualizacje komponentów 327
Minutniki 330
Kolejne kroki 332
Menu 333
Preferencje 335
Komponenty niestandardowe oraz Java2D 335
JavaFX 335
Interfejs użytkownika i doświadczenie użytkownika 336
11.
Obsługa
sieci i operacje we-wy 337
Strumienie 337
Podstawowe operacje we-wy 339
Strumienie znaków 341
Klasy opakowujące dla strumieni 342
Klasa java.io.File 346
Strumienie plików 351
Klasa RandomAccessFile 353
Interfejs API plików NIO 354
Klasy FileSystem i Path 355
Operacje interfejsu plików NIO 356
Pakiet NIO 360
Asynchroniczne operacje we-wy 360
Wydajność 361
Pliki zmapowane i zablokowane 361
Kanały 361
Bufory 362
Kodery i dekodery znaków 365
FileChannel 367
Programowanie sieciowe 370
Gniazda 372
Klienty i serwery 373
Klient DateAtHost 376
Gra rozproszona 378
Więcej do odkrycia 387
12.
Programowanie
aplikacji internetowych 389
Adresy URL 389
Klasa URL 390
Strumień danych 391
Pobieranie zawartości jako obiektu 392
Zarządzanie połączeniami 393
Procedury obsługi w praktyce 394
Przydatne frameworki procedur obsługi 394
Komunikacja z aplikacjami internetowymi 395
Korzystanie z metody GET 395
Korzystanie z metody POST 396
Obiekt HttpURLConnection 399
SSL i bezpieczna komunikacja internetowa 400
Aplikacje internetowe Javy 400
Cykl życia serwletu 402
Serwlety 402
Serwlet HelloClient 404
Odpowiedź serwletu 405
Parametry serwletu 406
Serwlet ShowParameters 408
Zarządzanie sesjami użytkowników 409
Serwlet ShowSession 410
Kontenery serwletów 412
Konfigurowanie za pomocą pliku web.xml oraz adnotacji 413
Mapowania wzorców adresów URL 416
Wdrażanie serwletu HelloClient 416
WWW - sieć na cały świat rozległa 417
13.
Rozszerzanie
Javy 419
Wydania Javy 419
JCP i JSR 420
Wyrażenia lambda 420
Modernizacja kodu 421
Rozszerzanie Javy poza podstawowe funkcjonalności 426
Końcowe podsumowanie i kolejne kroki 427
A. Przykłady kodu i program IntelliJ IDEA 429
Słowniczek 443
464
strony, oprawa miękka