Szczegóły ebooka

Java. Przewodnik doświadczonego programisty. Wydanie III

Java. Przewodnik doświadczonego programisty. Wydanie III

Cay S. Horstmann

Ebook

Java jest dojrzałym, rozbudowanym, wszechstronnym, a przy tym starannie zaprojektowanym i bezpiecznym językiem programowania. W jego nowej, 17. wersji wprowadzono sporo usprawnień podstawowych elementów języka i interfejsów API. Wiele starych idiomów języka straciło przydatność, a nowe mechanizmy i paradygmaty pozwalają zwiększyć efektywność tworzenia kodu. Zawodowy programista musi dobrze poznać te nowości i nauczyć się z nich korzystać.

Oto zaktualizowane i uzupełnione wydanie zwięzłego wprowadzenia do Javy SE 17, przeznaczonego dla profesjonalnych programistów Javy. Przedstawiono w nim wszystkie istotne zagadnienia, łącznie z takimi koncepcjami jak wyrażenia lambda i strumienie, nowoczesnymi konstrukcjami, jak rekordy i klasy zapieczętowane, a także zaawansowanymi technikami programowania współbieżnego. Książka została pomyślana w taki sposób, aby wszystkie ważne zmiany wprowadzone w najnowszej wersji Javy zostały zaprezentowane w esencjonalnej formie. Informacje uporządkowano tak, aby ułatwić szybki dostęp i łatwe zrozumienie potrzebnego zagadnienia. W przewodniku znalazło się też mnóstwo praktycznych informacji wraz z przykładami kodu, pozwalającymi natychmiast przetestować wszystkie nowości.

W książce między innymi:

  • rekordy i klasy zapieczętowane
  • programowanie funkcyjne z wyrażeniami lambda
  • optymalne zarządzanie danymi
  • nowoczesne funkcje biblioteczne i bezpieczne struktury danych
  • zmodularyzowane API języka Java
  • interfejsy API służące do przetwarzania daty i czasu oraz internacjonalizacji

Java: poznaj najnowsze mechanizmy i paradygmaty!

Wstęp

Podziękowania

O autorze

1. Podstawowe struktury programistyczne

  • 1.1. Nasz pierwszy program
    • 1.1.1. Analiza programu "Witaj, świecie!"
    • 1.1.2. Kompilacja i uruchamianie programu w języku Java
    • 1.1.3. Wywołania metod
    • 1.1.4. JShell
  • 1.2. Typy proste
    • 1.2.1. Typy całkowite ze znakiem
    • 1.2.2. Typy zmiennoprzecinkowe
    • 1.2.3. Typ char
    • 1.2.4. Typ boolean
  • 1.3. Zmienne
    • 1.3.1. Deklaracje zmiennych
    • 1.3.2. Identyfikatory
    • 1.3.3. Inicjalizacja
    • 1.3.4. Stałe
  • 1.4. Działania arytmetyczne
    • 1.4.1. Przypisanie
    • 1.4.2. Podstawowa arytmetyka
    • 1.4.3. Metody matematyczne
    • 1.4.4. Konwersja typów liczbowych
    • 1.4.5. Operatory relacji i operatory logiczne
    • 1.4.6. Duże liczby
  • 1.5. Ciągi znaków
    • 1.5.1. Łączenie ciągów znaków
    • 1.5.2. Wycinanie ciągów znaków
    • 1.5.3. Porównywanie ciągów znaków
    • 1.5.4. Konwersja liczb na znaki i znaków na liczby
    • 1.5.5. API klasy String
    • 1.5.6. Kodowanie znaków w języku Java
    • 1.5.7. Bloki tekstu
  • 1.6. Wejście i wyjście
    • 1.6.1. Wczytywanie danych wejściowych
    • 1.6.2. Formatowanie generowanych danych
  • 1.7. Kontrola przepływu
    • 1.7.1. Instrukcje warunkowe
    • 1.7.2. Słowo kluczowe switch
    • 1.7.3. Pętle
    • 1.7.4. Przerywanie i kontynuacja
    • 1.7.5. Zasięg zmiennych lokalnych
  • 1.8. Tablice i listy tablic
    • 1.8.1. Obsługa tablic
    • 1.8.2. Tworzenie tablicy
    • 1.8.3. Klasa ArrayList
    • 1.8.4. Klasy opakowujące typy proste
    • 1.8.5. Rozszerzona pętla for
    • 1.8.6. Kopiowanie tablic i obiektów ArrayList
    • 1.8.7. Algorytmy tablic
    • 1.8.8. Parametry wiersza poleceń
    • 1.8.9. Tablice wielowymiarowe
  • 1.9. Dekompozycja funkcjonalna
    • 1.9.1. Deklarowanie i wywoływanie metod statycznych
    • 1.9.2. Parametry tablicowe i zwracane wartości
    • 1.9.3. Zmienna liczba parametrów
  • Ćwiczenia

2. Programowanie obiektowe

  • 2.1. Praca z obiektami
    • 2.1.1. Metody dostępowe i modyfikujące
    • 2.1.2. Referencje do obiektu
  • 2.2. Implementowanie klas
    • 2.2.1. Zmienne instancyjne
    • 2.2.2. Nagłówki metod
    • 2.2.3. Treści metod
    • 2.2.4. Wywołania metod instancyjnych
    • 2.2.5. Referencja this
    • 2.2.6. Wywołanie przez wartość
  • 2.3. Tworzenie obiektów
    • 2.3.1. Implementacja konstruktorów
    • 2.3.2. Przeciążanie
    • 2.3.3. Wywoływanie jednego konstruktora z innego
    • 2.3.4. Domyślna inicjalizacja
    • 2.3.5. Inicjalizacja zmiennych instancyjnych
    • 2.3.6. Zmienne instancyjne z modyfikatorem final
    • 2.3.7. Konstruktor bez parametrów
  • 2.4. Rekordy
    • 2.4.1. Koncepcja rekordu
    • 2.4.2. Konstruktory: kanoniczny, niestandardowy i kompaktowy
  • 2.5. Statyczne zmienne i metody
    • 2.5.1. Zmienne statyczne
    • 2.5.2. Stałe statyczne
    • 2.5.3. Statyczne bloki inicjalizacyjne
    • 2.5.4. Metody statyczne
    • 2.5.5. Metody wytwórcze
  • 2.6. Pakiety
    • 2.6.1. Deklarowanie pakietów
    • 2.6.2. Polecenie jar
    • 2.6.3. Ścieżka przeszukiwań dla klas
    • 2.6.4. Dostęp do pakietu
    • 2.6.5. Importowanie klas
    • 2.6.6. Import metod statycznych
  • 2.7. Klasy zagnieżdżone
    • 2.7.1. Statyczne klasy zagnieżdżone
    • 2.7.2. Klasy wewnętrzne
    • 2.7.3. Specjalne reguły składni dla klas wewnętrznych
  • 2.8. Komentarze do dokumentacji
    • 2.8.1. Wstawianie komentarzy
    • 2.8.2. Komentarze klasy
    • 2.8.3. Komentarze metod
    • 2.8.4. Komentarze zmiennych
    • 2.8.5. Ogólne komentarze
    • 2.8.6. Odnośniki
    • 2.8.7. Opisy pakietów, modułów i ogólne
    • 2.8.8. Wycinanie komentarzy
  • Ćwiczenia

3. Interfejsy i wyrażenia lambda

  • 3.1. Interfejsy
    • 3.1.1. Korzystanie z interfejsów
    • 3.1.2. Deklarowanie interfejsu
    • 3.1.3. Implementowanie interfejsu
    • 3.1.4. Konwersja do typu interfejsu
    • 3.1.5. Rzutowanie i operator instanceof
    • 3.1.6. Forma operatora instanceof z "dopasowywaniem wzorca"
    • 3.1.7. Rozszerzanie interfejsów
    • 3.1.8. Implementacja wielu interfejsów
    • 3.1.9. Stałe
  • 3.2. Metody statyczne, domyślne i prywatne
    • 3.2.1. Metody statyczne
    • 3.2.2. Metody domyślne
    • 3.2.3. Rozstrzyganie konfliktów metod domyślnych
    • 3.2.4. Metody prywatne
  • 3.3. Przykłady interfejsów
    • 3.3.1. Interfejs Comparable
    • 3.3.2. Interfejs Comparator
    • 3.3.3. Interfejs Runnable
    • 3.3.4. Wywołania zwrotne interfejsu użytkownika
  • 3.4. Wyrażenia lambda
    • 3.4.1. Składnia wyrażeń lambda
    • 3.4.2. Interfejsy funkcyjne
  • 3.5. Referencje do metod i konstruktora
    • 3.5.1. Referencje do metod
    • 3.5.2. Referencje konstruktora
  • 3.6. Przetwarzanie wyrażeń lambda
    • 3.6.1. Implementacja odroczonego wykonania
    • 3.6.2. Wybór interfejsu funkcyjnego
    • 3.6.3. Implementowanie własnych interfejsów funkcyjnych
  • 3.7. Wyrażenia lambda i zasięg zmiennych
    • 3.7.1. Zasięg zmiennej lambda
    • 3.7.2. Dostęp do zmiennych zewnętrznych
  • 3.8. Funkcje wyższych rzędów
    • 3.8.1. Metody zwracające funkcje
    • 3.8.2. Metody modyfikujące funkcje
    • 3.8.3. Metody interfejsu Comparator
  • 3.9. Klasy lokalne i anonimowe
    • 3.9.1. Klasy lokalne
    • 3.9.2. Klasy anonimowe
  • Ćwiczenia

4. Dziedziczenie i mechanizm refleksji

  • 4.1. Rozszerzanie klas
    • 4.1.1. Klasy nadrzędne i podrzędne
    • 4.1.2. Definiowanie i dziedziczenie metod klas podrzędnych
    • 4.1.3. Przesłanianie metod
    • 4.1.4. Tworzenie klasy podrzędnej
    • 4.1.5. Przypisania klas nadrzędnych
    • 4.1.6. Rzutowanie
    • 4.1.7. Anonimowe klasy podrzędne
    • 4.1.8. Wywołania metod z super
  • 4.2. Hierarchie dziedziczenia
    • 4.2.1. Metody i klasy z modyfikatorem final
    • 4.2.2. Abstrakcyjne metody i klasy
    • 4.2.3. Ograniczony dostęp
    • 4.2.4. Typy zapieczętowane
    • 4.2.5. Dziedziczenie i metody domyślne
  • 4.3. Object - najwyższa klasa nadrzędna
    • 4.3.1. Metoda toString
    • 4.3.2. Metoda equals
    • 4.3.3. Metoda hashCode
    • 4.3.4. Klonowanie obiektów
  • 4.4. Wyliczenia
    • 4.4.1. Sposoby wyliczania
    • 4.4.2. Konstruktory, metody i pola
    • 4.4.3. Zawartość elementów
    • 4.4.4. Elementy statyczne
    • 4.4.5. Wyrażenia switch ze stałymi wyliczeniowymi
  • 4.5. Informacje o typie i zasobach w czasie działania programu
    • 4.5.1. Klasa Class
    • 4.5.2. Wczytywanie zasobów
    • 4.5.3. Programy wczytujące klasy
    • 4.5.4. Kontekstowy program wczytujący klasy
    • 4.5.5. Programy do ładowania usług
  • 4.6. Refleksje
    • 4.6.1. Wyliczanie elementów klasy
    • 4.6.2. Kontrolowanie obiektów
    • 4.6.3. Wywoływanie metod
    • 4.6.4. Tworzenie obiektów
    • 4.6.5. JavaBeans
    • 4.6.6. Praca z tablicami
    • 4.6.7. Klasa Proxy
  • Ćwiczenia

5. Wyjątki, asercje i logi

  • 5.1. Obsługa wyjątków
    • 5.1.1. Wyrzucanie wyjątków
    • 5.1.2. Hierarchia wyjątków
    • 5.1.3. Deklarowanie wyjątków kontrolowanych
    • 5.1.4. Przechwytywanie wyjątków
    • 5.1.5. Wyrażenie try z określeniem zasobów
    • 5.1.6. Klauzula finally
    • 5.1.7. Ponowne wyrzucanie wyjątków i łączenie ich w łańcuchy
    • 5.1.8. Nieprzechwycone wyjątki i ślad stosu wywołań
    • 5.1.9. Metody API pozwalające wyrzucać wyjątki
  • 5.2. Asercje
    • 5.2.1. Użycie asercji
    • 5.2.2. Włączanie i wyłączanie asercji
  • 5.3. Rejestrowanie danych
    • 5.3.1. Czy w Javie warto korzystać z frameworka rejestrowania danych?
    • 5.3.2. ABC rejestrowania danych
    • 5.3.3. Interfejs Platform Logging API
    • 5.3.4. Konfiguracja mechanizmów rejestrowania danych
    • 5.3.5. Programy obsługujące rejestrowanie danych
    • 5.3.6. Filtry i formaty
  • Ćwiczenia

6. Programowanie uogólnione

  • 6.1. Klasy uogólnione
  • 6.2. Metody uogólnione
  • 6.3. Ograniczenia typów
  • 6.4. Zmienność typów i symbole wieloznaczne
    • 6.4.1. Symbole wieloznaczne w typach podrzędnych
    • 6.4.2. Symbole wieloznaczne typów nadrzędnych
    • 6.4.3. Symbole wieloznaczne ze zmiennymi typami
    • 6.4.4. Nieograniczone symbole wieloznaczne
    • 6.4.5. Przechwytywanie symboli wieloznacznych
  • 6.5. Uogólnienia w maszynie wirtualnej Javy
    • 6.5.1. Wymazywanie typów
    • 6.5.2. Wprowadzanie rzutowania
    • 6.5.3. Metody pomostowe
  • 6.6. Ograniczenia uogólnień
    • 6.6.1. Brak typów prostych
    • 6.6.2. W czasie działania kodu wszystkie typy są surowe
    • 6.6.3. Nie możesz tworzyć instancji zmiennych opisujących typy
    • 6.6.4. Nie możesz tworzyć tablic z parametryzowanym typem
    • 6.6.5. Zmienne opisujące typ klasy nie są poprawne w kontekście statycznym
    • 6.6.6. Metody nie mogą wywoływać konfliktów po wymazywaniu typów
    • 6.6.7. Wyjątki i uogólnienia
  • 6.7. Refleksje i uogólnienia
    • 6.7.1. Klasa Class<T>
    • 6.7.2. Informacje o uogólnionych typach w maszynie wirtualnej
  • Ćwiczenia

7. Kolekcje

  • 7.1. Mechanizmy do zarządzania kolekcjami
  • 7.2. Iteratory
  • 7.3. Zestawy
  • 7.4. Mapy
  • 7.5. Inne kolekcje
    • 7.5.1. Właściwości
    • 7.5.2. Zestawy bitów
    • 7.5.3. Zestawy wyliczeniowe i mapy
    • 7.5.4. Stosy, kolejki zwykłe i dwukierunkowe oraz kolejki z priorytetami
    • 7.5.5. Klasa WeakHashMap
  • 7.6. Widoki
    • 7.6.1. Małe kolekcje
    • 7.6.2. Zakresy
    • 7.6.3. Niemodyfikowalne widoki
  • Ćwiczenia

8. Strumienie

  • 8.1. Od iteratorów do operacji strumieniowych
  • 8.2. Tworzenie strumienia
  • 8.3. Metody filter, map i flatMap
  • 8.4. Wycinanie podstrumieni i łączenie strumieni
  • 8.5. Inne przekształcenia strumieni
  • 8.6. Proste redukcje
  • 8.7. Typ Optional
    • 8.7.1. Tworzenie alternatywnej wartości
    • 8.7.2. Wykorzystywanie wartości tylko wtedy, gdy jest obecna
    • 8.7.3. Przetwarzanie potokowe wartości typu Optional
    • 8.7.4. Jak nie korzystać z wartości Optional
    • 8.7.5. Tworzenie wartości Optional
    • 8.7.6. Łączenie flatMap z funkcjami wartości Optional
    • 8.7.7. Zamiana Optional w Stream
  • 8.8. Kolekcje wyników
  • 8.9. Tworzenie map
  • 8.10. Grupowanie i partycjonowanie
  • 8.11. Kolektory strumieniowe
  • 8.12. Operacje redukcji
  • 8.13. Strumienie typów prostych
  • 8.14. Strumienie równoległe
  • Ćwiczenia

9. Przetwarzanie danych wejściowych i wyjściowych

  • 9.1. Strumienie wejściowe i wyjściowe, mechanizmy wczytujące i zapisujące
    • 9.1.1. Pozyskiwanie strumieni
    • 9.1.2. Wczytywanie bajtów
    • 9.1.3. Zapisywanie bajtów
    • 9.1.4. Kodowanie znaków
    • 9.1.5. Wczytywanie danych tekstowych
    • 9.1.6. Generowanie danych tekstowych
    • 9.1.7. Wczytywanie i zapisywanie danych binarnych
    • 9.1.8. Pliki o swobodnym dostępie
    • 9.1.9. Pliki mapowane w pamięci
    • 9.1.10. Blokowanie plików
  • 9.2. Ścieżki, pliki i katalogi
    • 9.2.1. Ścieżki
    • 9.2.2. Tworzenie plików i katalogów
    • 9.2.3. Kopiowanie, przenoszenie i usuwanie plików
    • 9.2.4. Odwiedzanie katalogów
    • 9.2.5. System plików ZIP
  • 9.3. Połączenia HTTP
    • 9.3.1. Klasy URLConnection i HttpURLConnection
    • 9.3.2. API klienta HTTP
  • 9.4. Wyrażenia regularne
    • 9.4.1. Składnia wyrażeń regularnych
    • 9.4.2. Testowanie dopasowania
    • 9.4.3. Odnajdywanie wszystkich dopasowań
    • 9.4.4. Grupy
    • 9.4.5. Dzielenie za pomocą znaczników
    • 9.4.6. Zastępowanie dopasowań
    • 9.4.7. Flagi
  • 9.5. Serializacja
    • 9.5.1. Interfejs Serializable
    • 9.5.2. Chwilowe zmienne instancyjne
    • 9.5.3. Metody readObject i writeObject
    • 9.5.4. Metody readExternal i writeExternal
    • 9.5.5. Metody readResolve i writeReplace
    • 9.5.6. Wersjonowanie
    • 9.5.7. Deserializacja i bezpieczeństwo
  • Ćwiczenia

10. Programowanie współbieżne

  • 10.1. Zadania współbieżne
    • 10.1.1. Uruchamianie zadań
    • 10.1.2. Obiekty Future
  • 10.2. Obliczenia asynchroniczne
    • 10.2.1. Klasa CompletableFuture
    • 10.2.2. Tworzenie obiektów typu CompletableFuture
    • 10.2.3. Długie zadania obsługujące interfejs użytkownika
  • 10.3. Bezpieczeństwo wątków
    • 10.3.1. Widoczność
    • 10.3.2. Wyścigi
    • 10.3.3. Strategie bezpiecznego korzystania ze współbieżności
    • 10.3.4. Klasy niemodyfikowalne
  • 10.4. Algorytmy równoległe
    • 10.4.1. Strumienie równoległe
    • 10.4.2. Równoległe operacje na tablicach
  • 10.5. Struktury danych bezpieczne dla wątków
    • 10.5.1. Klasa ConcurrentHashMap
    • 10.5.2. Kolejki blokujące
    • 10.5.3. Inne struktury danych bezpieczne dla wątków
  • 10.6. Atomowe liczniki i akumulatory
  • 10.7. Blokady i warunki
    • 10.7.1. Blokady
    • 10.7.2. Słowo kluczowe synchronized
    • 10.7.3. Oczekiwanie warunkowe
  • 10.8. Wątki
    • 10.8.1. Uruchamianie wątku
    • 10.8.2. Przerywanie wątków
    • 10.8.3. Zmienne lokalne w wątku
    • 10.8.4. Dodatkowe właściwości wątku
  • 10.9. Procesy
    • 10.9.1. Tworzenie procesu
    • 10.9.2. Uruchamianie procesu
    • 10.9.3. Uchwyty procesów
  • Ćwiczenia

11. Adnotacje

  • 11.1. Używanie adnotacji
    • 11.1.1. Elementy adnotacji
    • 11.1.2. Wielokrotne i powtarzane adnotacje
    • 11.1.3. Adnotacje deklaracji
    • 11.1.4. Adnotacje wykorzystania typów
    • 11.1.5. Jawne określanie odbiorców
  • 11.2. Definiowanie adnotacji
  • 11.3. Adnotacje standardowe
    • 11.3.1. Adnotacje do kompilacji
    • 11.3.2. Metaadnotacje
  • 11.4. Przetwarzanie adnotacji w kodzie
  • 11.5. Przetwarzanie adnotacji w kodzie źródłowym
    • 11.5.1. Przetwarzanie adnotacji
    • 11.5.2. API modelu języka
    • 11.5.3. Wykorzystanie adnotacji do generowania kodu źródłowego
  • Ćwiczenia

12. API daty i czasu

  • 12.1. Linia czasu
  • 12.2. Daty lokalne
  • 12.3. Modyfikatory daty
  • 12.4. Czas lokalny
  • 12.5. Czas strefowy
  • 12.6. Formatowanie i przetwarzanie
  • 12.7. Współpraca z przestarzałym kodem
  • Ćwiczenia

13. Internacjonalizacja

  • 13.1. Lokalizacje
    • 13.1.1. Określanie lokalizacji
    • 13.1.2. Domyślna lokalizacja
    • 13.1.3. Nazwy wyświetlane
  • 13.2. Formaty liczb
  • 13.3. Waluty
  • 13.4. Formatowanie czasu i daty
  • 13.5. Porównywanie i normalizacja
  • 13.6. Formatowanie komunikatów
  • 13.7. Pakiety z zasobami
    • 13.7.1. Organizacja pakietów z zasobami
    • 13.7.2. Klasy z pakietami
  • 13.8. Kodowanie znaków
  • 13.9. Preferencje
  • Ćwiczenia

14. Kompilacja i skryptowanie

  • 14.1. API kompilatora
    • 14.1.1. Wywołanie kompilatora
    • 14.1.2. Uruchamianie zadania kompilacji
    • 14.1.3. Przechwytywanie komunikatów diagnostycznych
    • 14.1.4. Wczytywanie plików źródłowych z pamięci
    • 14.1.5. Zapisywanie skompilowanego kodu w pamięci
  • 14.2. API skryptów
    • 14.2.1. Tworzenie silnika skryptowego
    • 14.2.2. Uruchamianie skryptów za pomocą metody eval
    • 14.2.3. Powiązania
    • 14.2.4. Przekierowanie wejścia i wyjścia
    • 14.2.5. Wywoływanie funkcji i metod skryptowych
    • 14.2.6. Kompilowanie skryptu
  • Ćwiczenia

15. System modułów na platformie Java

  • 15.1. Koncepcja modułu
  • 15.2. Nazywanie modułów
  • 15.3. Modularny program "Witaj, świecie!"
  • 15.4. Dołączanie modułów
  • 15.5. Eksportowanie pakietów
  • 15.6. Moduły i dostęp przez refleksje
  • 15.7. Modularne pliki JAR
  • 15.8. Moduły automatyczne
  • 15.9. Moduł nienazwany
  • 15.10. Flagi wiersza poleceń dla migracji
  • 15.11. Wymagania przechodnie i statyczne
  • 15.12. Wybiórcze eksportowanie i otwieranie
  • 15.13. Wczytywanie usługi
  • 15.14. Narzędzia do pracy z modułami
  • Ćwiczenia
  • Tytuł: Java. Przewodnik doświadczonego programisty. Wydanie III
  • Autor: Cay S. Horstmann
  • Tytuł oryginału: Core Java for the Impatient, 3rd Edition
  • Tłumaczenie: Krzysztof Bąbol, Andrzej Stefański
  • ISBN: 978-83-289-0141-4, 9788328901414
  • Data wydania: 2023-10-03
  • Format: Ebook
  • Identyfikator pozycji: jav8p3
  • Wydawca: Helion