Szczegóły ebooka

Java. Podstawy. Wydanie IX

Java. Podstawy. Wydanie IX

Gary Cornell, Cay S. Horstmann

Ebook

Wykorzystaj potencjał lidera na rynku języków programowania!

Pomimo zaawansowanego wieku Java wciąż jest na topie. Ten język programowania oraz narzędzia z nim powiązane są najczęściej wybierane do tworzenia rozbudowanych systemów informatycznych. Skąd ta popularność? Przejrzysta składnia, obsługa nowoczesnych technik przesyłania informacji, automatyczne czyszczenie pamięci to tylko niektóre z atutów Javy. Jeżeli dołożymy do tego ogromną rzeszę użytkowników chętnych do pomocy, wszystko staje się jasne. Java jeszcze długo będzie na świeczniku!

Kolejne wydanie tej cenionej książki zostało zaktualizowane o wszystkie nowości, które pojawiły się w wersji 7 platformy Java Standard Edition. W trakcie lektury poznasz składnię języka oraz wszystkie istotne kwestie związane z programowaniem w Javie. Zrozumiesz założenia programowania obiektowego, nauczysz się korzystać z interfejsów oraz obsługiwać wyjątki. Przekonasz się również, jakie ułatwienia w tym zakresie oferuje Java 7 - obsługa wielu wyjątków w ramach jednego bloku catch to tylko czubek góry lodowej. Książka ta jest idealną pozycją dla wszystkich osób chcących poznać język Java. Sprawdzi się ona również w rękach doświadczonych programistów - jako źródło informacji na temat nowości w Java Standard Edition 7.

Poznaj:

  • podstawy języka Java
  • zasady programowania obiektowego
  • zastosowanie interfejsów
  • nowości wprowadzone w ostatniej wersji Javy

Wykorzystaj siłę obiektów. Zacznij programować obiektowo w języku Java!

  • Wstęp
    • Do Czytelnika
    • O książce
    • Konwencje typograficzne
    • Przykłady kodu
  • Podziękowania
  • Rozdział 1 Wstęp do Javy
    • W tym rozdziale:
    • 1.1. Java jako platforma programistyczna
    • 1.2. Słowa klucze białej księgi Javy
      • 1.2.1. Prosty
      • 1.2.2. Obiektowy
      • 1.2.3. Sieciowy
      • 1.2.4. Niezawodny
      • 1.2.5. Bezpieczny
      • 1.2.6. Niezależny od architektury
      • 1.2.7. Przenośny
      • 1.2.8. Interpretowany
      • 1.2.9. Wysokowydajny
      • 1.2.10. Wielowątkowy
      • 1.2.11. Dynamiczny
    • 1.3. Aplety Javy i internet
    • 1.4. Krótka historia Javy
    • 1.5. Główne nieporozumienia dotyczące Javy
  • Rozdział 2 Środowisko programistyczne Javy
    • W tym rozdziale:
    • 2.1. Instalacja oprogramowania Java Development Kit
      • 2.1.1. Pobieranie pakietu JDK
      • 2.1.2. Ustawianie ścieżki dostępu
      • 2.1.3. Instalacja bibliotek i dokumentacji
      • 2.1.4. Instalacja przykładowych programów
      • 2.1.5. Drzewo katalogów Javy
    • 2.2. Wybór środowiska programistycznego
    • 2.3. Używanie narzędzi wiersza poleceń
      • 2.3.1. Rozwiązywanie problemów
    • 2.4. Praca w zintegrowanym środowisku programistycznym
      • 2.4.1. Znajdowanie błędów kompilacji
    • 2.5. Uruchamianie aplikacji graficznej
    • 2.6. Tworzenie i uruchamianie apletów
  • Rozdział 3 Podstawowe elementy języka Java
    • W tym rozdziale:
    • 3.1. Prosty program w Javie
    • 3.2. Komentarze
    • 3.3. Typy danych
      • 3.3.1. Typy całkowite
      • 3.3.2. Typy zmiennoprzecinkowe
      • 3.3.3. Typ char
      • 3.3.4. Typ boolean
    • 3.4. Zmienne
      • 3.4.1. Inicjacja zmiennych
      • 3.4.2. Stałe
    • 3.5. Operatory
      • 3.5.1. Operatory inkrementacji i dekrementacji
      • 3.5.2. Operatory relacyjne i logiczne
      • 3.5.3. Operatory bitowe
      • 3.5.4. Funkcje i stałe matematyczne
      • 3.5.5. Konwersja typów numerycznych
      • 3.5.6. Rzutowanie
      • 3.5.7. Nawiasy i priorytety operatorów
      • 3.5.8. Typ wyliczeniowy
    • 3.6. Łańcuchy
      • 3.6.1. Podłańcuchy
      • 3.6.2. Konkatenacja
      • 3.6.3. Łańcuchów nie można modyfikować
      • 3.6.4. Porównywanie łańcuchów
      • 3.6.5. Łańcuchy puste i łańcuchy null
      • 3.6.6. Współrzędne kodowe znaków i jednostki kodowe
      • 3.6.7. API String
      • 3.6.8. Dokumentacja API w internecie
      • 3.6.9. Składanie łańcuchów
    • 3.7. Wejście i wyjście
      • 3.7.1. Odbieranie danych wejściowych
      • 3.7.2. Formatowanie danych wyjściowych
      • 3.7.3. Zapis i odczyt plików
    • 3.8. Przepływ sterowania
      • 3.8.1. Zasięg blokowy
      • 3.8.2. Instrukcje warunkowe
      • 3.8.3. Pętle
      • 3.8.4. Pętle o określonej liczbie powtórzeń
      • 3.8.5. Wybór wielokierunkowy instrukcja switch
      • 3.8.6. Instrukcje przerywające przepływ sterowania
    • 3.9. Wielkie liczby
    • 3.10. Tablice
      • 3.10.1. Pętla typu for each
      • 3.10.2. Inicjowanie tablic i tworzenie tablic anonimowych
      • 3.10.3. Kopiowanie tablicy
      • 3.10.4. Parametry wiersza poleceń
      • 3.10.5. Sortowanie tablicy
      • 3.10.6. Tablice wielowymiarowe
      • 3.10.7. Tablice postrzępione
  • Rozdział 4 Obiekty i klasy
    • W tym rozdziale:
    • 4.1. Wstęp do programowania obiektowego
      • 4.1.1. Klasy
      • 4.1.2. Obiekty
      • 4.1.3. Identyfikacja klas
      • 4.1.4. Relacje między klasami
    • 4.2. Używanie klas predefiniowanych
      • 4.2.1. Obiekty i zmienne obiektów
      • 4.2.2. Klasa GregorianCalendar
      • 4.2.3. Metody udostępniające i zmieniające wartość elementu
    • 4.3. Definiowanie własnych klas
      • 4.3.1. Klasa Employee
      • 4.3.2. Używanie wielu plików źródłowych
      • 4.3.3. Analiza klasy Employee
      • 4.3.4. Pierwsze kroki w tworzeniu konstruktorów
      • 4.3.5. Parametry jawne i niejawne
      • 4.3.6. Korzyści z hermetyzacji
      • 4.3.7. Przywileje klasowe
      • 4.3.8. Metody prywatne
      • 4.3.9. Stałe jako pola klasy
    • 4.4. Pola i metody statyczne
      • 4.4.1. Pola statyczne
      • 4.4.2. Stałe statyczne
      • 4.4.3. Metody statyczne
      • 4.4.4. Metody fabryczne
      • 4.4.5. Metoda main
    • 4.5. Parametry metod
    • 4.6. Konstruowanie obiektów
      • 4.6.1. Przeciążanie
      • 4.6.2. Inicjacja pól wartościami domyślnymi
      • 4.6.3. Konstruktor bezargumentowy
      • 4.6.4. Jawna inicjacja pól
      • 4.6.5. Nazywanie parametrów
      • 4.6.6. Wywoływanie innego konstruktora
      • 4.6.7. Bloki inicjujące
      • 4.6.8. Niszczenie obiektów i metoda finalize
    • 4.7. Pakiety
      • 4.7.1. Importowanie klas
      • 4.7.2. Importy statyczne
      • 4.7.3. Dodawanie klasy do pakietu
      • 4.7.4. Zasięg pakietów
    • 4.8. Ścieżka klas
      • 4.8.1. Ustawianie ścieżki klas
    • 4.9. Komentarze dokumentacyjne
      • 4.9.1. Wstawianie komentarzy
      • 4.9.2. Komentarze do klas
      • 4.9.3. Komentarze do metod
      • 4.9.4. Komentarze do pól
      • 4.9.5. Komentarze ogólne
      • 4.9.6. Komentarze do pakietów i ogólne
      • 4.9.7. Generowanie dokumentacji
    • 4.10. Porady dotyczące projektowania klas
  • Rozdział 5 Dziedziczenie
    • W tym rozdziale:
    • 5.1. Klasy, nadklasy i podklasy
      • 5.1.1. Hierarchia dziedziczenia
      • 5.1.2. Polimorfizm
      • 5.1.3. Wiązanie dynamiczne
      • 5.1.4. Wyłączanie dziedziczenia klasy i metody finalne
      • 5.1.5. Rzutowanie
      • 5.1.6. Klasy abstrakcyjne
      • 5.1.7. Ochrona dostępu
    • 5.2. Klasa bazowa Object
      • 5.2.1. Metoda equals
      • 5.2.2. Porównywanie a dziedziczenie
      • 5.2.3. Metoda hashCode
      • 5.2.4. Metoda toString
    • 5.3. Generyczne listy tablicowe
      • 5.3.1. Dostęp do elementów listy tablicowej
      • 5.3.2. Zgodność pomiędzy typowanymi a surowymi listami tablicowymi
    • 5.4. Osłony obiektów i autoboxing
    • 5.5. Metody ze zmienną liczbą parametrów
    • 5.6. Klasy wyliczeniowe
    • 5.7. Refleksja
      • 5.7.1. Klasa Class
      • 5.7.2. Podstawy przechwytywania wyjątków
      • 5.7.3. Zastosowanie refleksji w analizie funkcjonalności klasy
      • 5.7.4. Refleksja w analizie obiektów w czasie działania programu
      • 5.7.5. Zastosowanie refleksji w generycznym kodzie tablicowym
      • 5.7.6. Wywoływanie dowolnych metod
    • 5.8. Porady projektowe dotyczące dziedziczenia
  • Rozdział 6 Interfejsy i klasy wewnętrzne
    • W tym rozdziale:
    • 6.1. Interfejsy
      • 6.1.1. Własności interfejsów
      • 6.1.2. Interfejsy a klasy abstrakcyjne
    • 6.2. Klonowanie obiektów
    • 6.3. Interfejsy a sprzężenie zwrotne
    • 6.4. Klasy wewnętrzne
      • 6.4.1. Dostęp do stanu obiektu w klasie wewnętrznej
      • 6.4.2. Specjalne reguły składniowe dotyczące klas wewnętrznych
      • 6.4.3. Czy klasy wewnętrzne są potrzebne i bezpieczne?
      • 6.4.4. Lokalne klasy wewnętrzne
      • 6.4.5. Dostęp do zmiennych finalnych z metod zewnętrznych
      • 6.4.6. Anonimowe klasy wewnętrzne
      • 6.4.7. Statyczne klasy wewnętrzne
    • 6.5. Klasy proxy
      • 6.5.1. Własności klas proxy
  • Rozdział 7 Grafika
    • W tym rozdziale:
    • 7.1. Wprowadzenie do pakietu Swing
    • 7.2. Tworzenie ramki
    • 7.3. Pozycjonowanie ramki
      • 7.3.1. Własności ramek
      • 7.3.2. Określanie rozmiaru ramki
    • 7.4. Wyświetlanie informacji w komponencie
    • 7.5. Figury 2D
    • 7.6. Kolory
    • 7.7. Czcionki
    • 7.8. Wyświetlanie obrazów
  • Rozdział 8 Obsługa zdarzeń
    • W tym rozdziale:
    • 8.1. Podstawy obsługi zdarzeń
      • 8.1.1. Przykład obsługa kliknięcia przycisku
      • 8.1.2. Nabywanie biegłości w posługiwaniu się klasami wewnętrznymi
      • 8.1.3. Tworzenie słuchaczy zawierających jedno wywołanie metody
      • 8.1.4. Przykład zmiana stylu
      • 8.1.5. Klasy adaptacyjne
    • 8.2. Akcje
    • 8.3. Zdarzenia generowane przez mysz
    • 8.4. Hierarchia zdarzeń w bibliotece AWT
      • 8.4.1. Zdarzenia semantyczne i niskiego poziomu
  • Rozdział 9 Komponenty Swing interfejsu użytkownika
    • W tym rozdziale:
    • 9.1. Swing a wzorzec projektowy Model-View-Controller
      • 9.1.1. Wzorce projektowe
      • 9.1.2. Wzorzec Model-View-Controller
      • 9.1.3. Analiza MVC przycisków Swing
    • 9.2. Wprowadzenie do zarządzania rozkładem
      • 9.2.1. Rozkład brzegowy
      • 9.2.2. Rozkład siatkowy
    • 9.3. Wprowadzanie tekstu
      • 9.3.1. Pola tekstowe
      • 9.3.2. Etykiety komponentów
      • 9.3.3. Pola haseł
      • 9.3.4. Obszary tekstowe
      • 9.3.5. Panele przewijane
    • 9.4. Komponenty umożliwiające wybór opcji
      • 9.4.1. Pola wyboru
      • 9.4.2. Przełączniki
      • 9.4.3. Obramowanie
      • 9.4.4. Listy rozwijalne
      • 9.4.5. Suwaki
    • 9.5. Menu
      • 9.5.1. Tworzenie menu
      • 9.5.2. Ikony w elementach menu
      • 9.5.3. Pola wyboru i przełączniki jako elementy menu
      • 9.5.4. Menu podręczne
      • 9.5.5. Mnemoniki i akceleratory
      • 9.5.6. Aktywowanie i dezaktywowanie elementów menu
      • 9.5.7. Paski narzędzi
      • 9.5.8. Dymki
    • 9.6. Zaawansowane techniki zarządzania rozkładem
      • 9.6.1. Rozkład GridBagLayout
        • 9.6.1.1. Parametry gridx, gridy, gridwidth i gridheight
        • 9.6.1.2. Pola weight
        • 9.6.1.3. Parametry fill i anchor
        • 9.6.1.4. Dopełnienie
        • 9.6.1.5. Inny sposób ustawiania wartości parametrów gridx, gridy, gridwidth i gridheight
        • 9.6.1.6. Klasa pomocnicza ułatwiająca pracę z ograniczeniami GridBagLayout
      • 9.6.2. Rozkład grupowy
      • 9.6.3. Nieużywanie żadnego zarządcy rozkładu
      • 9.6.4. Niestandardowi zarządcy rozkładu
      • 9.6.5. Kolejka dostępu
    • 9.7. Okna dialogowe
      • 9.7.1. Okna dialogowe opcji
      • 9.7.2. Tworzenie okien dialogowych
      • 9.7.3. Wymiana danych
      • 9.7.4. Okna dialogowe wyboru plików
      • 9.7.5. Okna dialogowe wyboru kolorów
  • Rozdział 10 Przygotowywanie apletów i aplikacji do użytku
    • W tym rozdziale:
    • 10.1. Pliki JAR
      • 10.1.1. Manifest
      • 10.1.2. Wykonywalne pliki JAR
      • 10.1.3. Zasoby
      • 10.1.4. Pieczętowanie pakietów
    • 10.2. Java Web Start
      • 10.2.1. Piaskownica
      • 10.2.2. Podpisywanie kodu
      • 10.2.3. API JNLP
    • 10.3. Aplety
      • 10.3.1. Prosty aplet
        • 10.3.1.1. Konwersja programów na aplety
      • 10.3.2. Znacznik applet i jego atrybuty
      • 10.3.3. Znacznik object
      • 10.3.4. Parametry przekazujące informacje do apletów
      • 10.3.5. Dostęp do obrazów i plików audio
      • 10.3.6. Środowisko działania apletu
        • 10.3.6.1. Komunikacja pomiędzy apletami
        • 10.3.6.2. Wyświetlanie elementów w przeglądarce
    • 10.4. Zapisywanie preferencji użytkownika
      • 10.4.1. Mapy własności
      • 10.4.2. API Preferences
  • Rozdział 11 Wyjątki, dzienniki, asercje i debugowanie
    • W tym rozdziale:
    • 11.1. Obsługa błędów
      • 11.1.1. Klasyfikacja wyjątków
      • 11.1.2. Deklarowanie wyjątków kontrolowanych
      • 11.1.3. Zgłaszanie wyjątków
      • 11.1.4. Tworzenie klas wyjątków
    • 11.2. Przechwytywanie wyjątków
      • 11.2.1. Przechwytywanie wielu typów wyjątków
      • 11.2.2. Powtórne generowanie wyjątków i budowanie łańcuchów wyjątków
      • 11.2.3. Klauzula finally
      • 11.2.4. Instrukcja try z zasobami
      • 11.2.5. Analiza danych ze śledzenia stosu
    • 11.3. Wskazówki dotyczące stosowania wyjątków
    • 11.4. Asercje
      • 11.4.1. Włączanie i wyłączanie asercji
      • 11.4.2. Zastosowanie asercji do sprawdzania parametrów
      • 11.4.3. Zastosowanie asercji do dokumentowania założeń
    • 11.5. Dzienniki
      • 11.5.1. Podstawy zapisu do dziennika
      • 11.5.2. Zaawansowane techniki zapisu do dziennika
      • 11.5.3. Zmiana konfiguracji menedżera dzienników
      • 11.5.4. Lokalizacja
      • 11.5.5. Obiekty typu Handler
      • 11.5.6. Filtry
      • 11.5.7. Formatery
      • 11.5.8. Przepis na dziennik
    • 11.6. Wskazówki dotyczące debugowania
    • 11.7. Wskazówki dotyczące debugowania aplikacji z GUI
      • 11.7.1. Zaprzęganie robota AWT do pracy
    • 11.8. Praca z debugerem
  • Rozdział 12 Programowanie ogólne
    • W tym rozdziale:
    • 12.1. Dlaczego programowanie ogólne
      • 12.1.1. Dla kogo programowanie ogólne
    • 12.2. Definicja prostej klasy ogólnej
    • 12.3. Metody ogólne
    • 12.4. Ograniczenia zmiennych typowych
    • 12.5. Kod ogólny a maszyna wirtualna
      • 12.5.1. Translacja wyrażeń generycznych
      • 12.5.2. Translacja metod ogólnych
      • 12.5.3. Używanie starego kodu
    • 12.6. Ograniczenia i braki
      • 12.6.1. Nie można podawać typów prostych jako parametrów typowych
      • 12.6.2. Sprawdzanie typów w czasie działania programu jest możliwe tylko dla typów surowych
      • 12.6.3. Nie można tworzyć tablic typów ogólnych
      • 12.6.4. Ostrzeżenia dotyczące zmiennej liczby argumentów
      • 12.6.5. Nie wolno tworzyć egzemplarzy zmiennych typowych
      • 12.6.6. Zmiennych typowych nie można używać w statycznych kontekstach klas ogólnych
      • 12.6.7. Obiektów klasy ogólnej nie można generować ani przechwytywać
        • 12.6.7.1. Można wyłączyć sprawdzanie wyjątków kontrolowanych
      • 12.6.8. Uważaj na konflikty, które mogą powstać po wymazaniu typów
    • 12.7. Zasady dziedziczenia dla typów ogólnych
    • 12.8. Typy wieloznaczne
      • 12.8.1. Ograniczenia nadtypów typów wieloznacznych
      • 12.8.2. Typy wieloznaczne bez ograniczeń
      • 12.8.3. Chwytanie typu wieloznacznego
    • 12.9. Refleksja a typy ogólne
      • 12.9.1. Zastosowanie parametrów Class<T> do dopasowywania typów
      • 12.9.2. Informacje o typach generycznych w maszynie wirtualnej
  • Rozdział 13 Kolekcje
    • W tym rozdziale:
    • 13.1. Interfejsy kolekcyjne
      • 13.1.1. Oddzielenie warstwy interfejsów od warstwy klas konkretnych
      • 13.1.2. Interfejsy Collection i Iterator
        • 13.1.2.1. Iteratory
        • 13.1.2.2. Usuwanie elementów
        • 13.1.2.3. Uogólnione metody użytkowe
    • 13.2. Konkretne klasy kolekcyjne
      • 13.2.1. Listy powiązane
      • 13.2.2. Listy tablicowe
      • 13.2.3. Zbiór HashSet
      • 13.2.4. Zbiór TreeSet
      • 13.2.5. Porównywanie obiektów
      • 13.2.6. Kolejki Queue i Deque
      • 13.2.7. Kolejki priorytetowe
      • 13.2.8. Mapy
      • 13.2.9. Specjalne klasy Set i Map
        • 13.2.9.1. Klasa WeakHashMap
        • 13.2.9.2. Klasy LinkedHashSet i LinkedHashMap
        • 13.2.9.3. Klasy EnumSet i EnumMap
        • 13.2.9.4. Klasa IdentityHashMap
    • 13.3. Architektura kolekcji
      • 13.3.1. Widoki i obiekty opakowujące
        • 13.3.1.1. Lekkie obiekty opakowujące kolekcje
        • 13.3.1.2. Widoki przedziałowe
        • 13.3.1.3. Widoki niemodyfikowalne
        • 13.3.1.4. Widoki synchronizowane
        • 13.3.1.5. Widoki kontrolowane
        • 13.3.1.6. Uwagi dotyczące operacji opcjonalnych
      • 13.3.2. Operacje zbiorcze
      • 13.3.3. Konwersja pomiędzy kolekcjami a tablicami
    • 13.4. Algorytmy
      • 13.4.1. Sortowanie i tasowanie
      • 13.4.2. Wyszukiwanie binarne
      • 13.4.3. Proste algorytmy
      • 13.4.4. Pisanie własnych algorytmów
    • 13.5. Stare kolekcje
      • 13.5.1. Klasa Hashtable
      • 13.5.2. Wyliczenia
      • 13.5.3. Mapy własności
      • 13.5.4. Stosy
      • 13.5.5. Zbiory bitów
        • 13.5.5.1. Test wydajności za pomocą sita Eratostenesa
  • Rozdział 14 Wielowątkowość
    • W tym rozdziale:
    • 14.1. Czym są wątki
      • 14.1.1. Wykonywanie zadań w osobnych wątkach
    • 14.2. Przerywanie wątków
    • 14.3. Stany wątków
      • 14.3.1. Wątki NEW
      • 14.3.2. Wątki RUNNABLE
      • 14.3.3. Wątki BLOCKED i WAITING
      • 14.3.4. Zamykanie wątków
    • 14.4. Własności wątków
      • 14.4.1. Priorytety wątków
      • 14.4.2. Wątki demony
      • 14.4.3. Procedury obsługi nieprzechwyconych wyjątków
    • 14.5. Synchronizacja
      • 14.5.1. Przykład sytuacji powodującej wyścig
      • 14.5.2. Wyścigi
      • 14.5.3. Obiekty klasy Lock
      • 14.5.4. Warunki
      • 14.5.5. Słowo kluczowe synchronized
      • 14.5.6. Bloki synchronizowane
      • 14.5.7. Monitor
      • 14.5.8. Pola ulotne
      • 14.5.9. Zmienne finalne
      • 14.5.10. Zmienne atomowe
      • 14.5.11. Zakleszczenia
      • 14.5.12. Zmienne lokalne wątków
      • 14.5.13. Testowanie blokad i odmierzanie czasu
      • 14.5.14. Blokady odczytu-zapisu
      • 14.5.15. Dlaczego metody stop i suspend są wycofywane
    • 14.6. Kolejki blokujące
    • 14.7. Kolekcje bezpieczne wątkowo
      • 14.7.1. Szybkie mapy, zbiory i kolejki
      • 14.7.2. Tablice kopiowane przy zapisie
      • 14.7.3. Starsze kolekcje bezpieczne wątkowo
    • 14.8. Interfejsy Callable i Future
    • 14.9. Klasa Executors
      • 14.9.1. Pule wątków
      • 14.9.2. Planowanie wykonywania
      • 14.9.3. Kontrolowanie grup zadań
      • 14.9.4. Szkielet rozgałęzienie-złączenie
    • 14.10. Synchronizatory
      • 14.10.1. Semafory
      • 14.10.2. Klasa CountDownLatch
      • 14.10.3. Bariery
      • 14.10.4. Klasa Exchanger
      • 14.10.5. Kolejki synchroniczne
    • 14.11. Wątki a biblioteka Swing
      • 14.11.1. Uruchamianie czasochłonnych zadań
      • 14.11.2. Klasa SwingWorker
      • 14.11.3. Zasada jednego wątku
  • Dodatek A Słowa kluczowe Javy
  • Tytuł: Java. Podstawy. Wydanie IX
  • Autor: Cay S. Horstmann, Gary Cornell
  • Tytuł oryginału: Core Java Volume I--Fundamentals (9th Edition) (Core Series)
  • Tłumaczenie: Łukasz Piwko
  • ISBN: 978-83-246-7759-7, 9788324677597
  • Data wydania: 2013-12-09
  • Format: Ebook
  • Identyfikator pozycji: javpd9
  • Wydawca: Helion