Inicjalizacja i sprzątanie Wykonał: Marcin Ganczarek 140544
Plan Gwarantowana inicjalizacja przez konstruktor Przeciążanie metod Sprzątanie: finalizacja i odśmiecanie pamięci Inicjalizacja składowych Inicjalizacja tablic
Plan Gwarantowana inicjalizacja przez konstruktor Przeciążanie metod Sprzątanie: finalizacja i odśmiecanie pamięci Inicjalizacja składowych Inicjalizacja tablic
Gwarantowana inicjalizacja przez konstruktor W Javie pojęcia tworzenia i inicjalizacji obiektu połączono Do tworzenia i inicjalizacji obiektu służy specjalna metoda nazwana konstruktorem Konstruktor nie zwraca żadnej wartości i nie można tego zmienić Jeżeli napiszemy klasę bez konstruktora to kompilator automatycznie utworzy konstruktor domyślny za nas Konstruktor domyślny to konstruktor nie pobierający żadnych argumentów
Gwarantowana inicjalizacja przez konstruktor Proste przykłady klas z konstruktorem 1. Konstruktor bez argumentów class Ala { Ala() System.out.println(”Ala ma kota”); } 2. Konstruktor z argumentami class Ola { Ola (int i) System.out.println(”Ola ma” + i + ”kotów”); }
Plan Gwarantowana inicjalizacja przez konstruktor Przeciążanie metod Sprzątanie: finalizacja i odśmiecanie pamięci Inicjalizacja składowych Inicjalizacja tablic
Przykład klasy z przeciążonymi metodami Przeciążanie metod Przykład klasy z przeciążonymi metodami class Drzewo { int wysokość; Drzewo() { System.out.println(”Zasadzenie ziarna”); wysokość = 0; } Drzewo(int i) { System.out.println(”Stworzenie drzewa o wysokości ” + i + ”metrów”); wysokość = i; void info() { System.out.println(”Wysokość drzewa to ” + wysokość + ”metrów”); void info(String s) { System.out.println(s + ”: Wysokość drzewa to ” + wysokość + ”metrów”);
Przeciążanie metod Każda przeciążona metoda musi posiadać unikatową listę typów argumentów Nie można użyć typu wartości zwracanej do odróżnienia metod przeciążonych Różnica w kolejności argumentów jest wystarczająca, aby odróżnić dwie metody class Student { Student(String s, int i) { System.out.println(s + ” otrzymał ocenę ” + i); } Student(int i, String s) { System.out.println(i + ” to ocena ” + s);
Przeciążanie metod Słowo kluczowe this – zwraca odwołanie do obiektu, na rzecz którego metoda została wywołana. Może być stosowane tylko wewnątrz metody Wywołując metodę klasy z wnętrza innej metody tej klasy, nie ma potrzeby używania this this jest wykorzystywane tylko w przypadkach, kiedy trzeba jawnie użyć odwołania do aktualnego obiektu Słowo kluczowe this umożliwia nam wywoływać jeden konstruktor z drugiego
Przeciążanie metod Wywołanie konstruktora za pomocą this musi być pierwszą rzeczą, którą robimy Stosując słowo kluczowe this można wywołać tylko jeden konstruktor Za pomocą this nie można wywołać konstruktora z wnętrza jakiejkolwiek metody nie będącej konstruktorem
Przykład wywoływania konstruktora z konstruktora Przeciążanie metod Przykład wywoływania konstruktora z konstruktora class pies { pies(int i) { System.out.println(”Mam ” + i + ” psów”); } pies(String s) { this(i); System.out.println(s + ” ma psa”); pies(String s, int i) { this(s); System.out.println(s + ” ma ” + i + ” psów”);
Plan Gwarantowana inicjalizacja przez konstruktor Przeciążanie metod Sprzątanie: finalizacja i odśmiecanie pamięci Inicjalizacja składowych Inicjalizacja tablic
Sprzątanie: finalizacja i odśmiecanie pamięci Różnice między Java a C++ Java nie pozwala na tworzenie obiektów lokalnych Java nie posiada destruktorów W C++ obiekty zawsze są niszczone, podczas gdy w Javie obiekty nie zawsze ulegają odśmiecaniu Podsumowując W Javie: Obiekty mogą nie zostać poddane odśmiecaniu Odśmiecanie pamięci to nie destrukcja Odśmiecanie dotyczy wyłącznie pamięci
Sprzątanie: finalizacja i odśmiecanie pamięci Do zwalniania pamięci w Javie stosuje się metody finalize() i odśmiecacz pamięci Metodę finalize() definiuje się we własnej klasie i wykorzystuje się ją przeważnie w przypadkach, w których obiekt może alokować pamięć inaczej niż poprzez stworzenie obiektu Metodę finalize() stosuje się także do weryfikacji warunku zakończenia obiektu Finalizacja i odśmiecanie nie są zagwarantowane
Sprzątanie: finalizacja i odśmiecanie pamięci Różne sposoby pracy różnych odśmiecaczy Zliczanie referencji Odśmiecacze kopiujące Adaptacyjny model odśmiecania ”Przyśpieszacze” JVM Ładowacz klas (ang. loader) Kompilator Just-In-Time (JIT) Technologie Java HotSpot
Plan Gwarantowana inicjalizacja przez konstruktor Przeciążanie metod Sprzątanie: finalizacja i odśmiecanie pamięci Inicjalizacja składowych Inicjalizacja tablic
Inicjalizacja składowych W Javie w porównaniu do C++ pozwala na przypisanie wartości w miejscu definicji zmiennej wewnątrz klasy Można wywołać metodę żeby była wartością początkową pod warunkiem, że metoda taka może posiadać argumenty , które już zostały zainicjalizowanymi składowymi klasy Tak można napisać class A { int i = f(); int j = g(i); // … } Tak nie można napisać class A { int j = g(i); int i = f(); // … }
Inicjalizacja składowych Do przeprowadzenia inicjalizacji można wykorzystać konstruktor Kolejność inicjalizacji wewnątrz klasy jest wyznaczona przez kolejność definiowania zmiennych w danej klasie Jeżeli zmienna typu podstawowego (boolean, char, byte, short, int, long, float, double, void) jest składową klasy to ma zapewnioną domyślną wartość początkową Zmienne definiowane jako static mają taką samą inicjalizacje jak w przypadku zmiennych nie będących statycznymi. Inicjalizacja statyczna występuje tylko raz wtedy , gdy jest potrzebna
Plan Gwarantowana inicjalizacja przez konstruktor Przeciążanie metod Sprzątanie: finalizacja i odśmiecanie pamięci Inicjalizacja składowych Inicjalizacja tablic
Inicjalizacja tablic W Javie tablice można zdefiniować w następujący sposób int[] a1; albo int a1[] Tablica jest ciągiem obiektów albo zmiennych typu podstawowego, wszystkich tego samego typu, zebranych pod wspólną nazwą Przy definiowaniu tablicy nie można ustalić jej wielkości. Aby stworzyć obszar dla tablicy trzeba użyć wyrażenia inicjalizującego Tablice posiadają własną składową lenght mówiącą ile jest elementów w tablicy Tablice można zainicjalizować w następujący sposób int[] a1 = {1, 2, 3}; albo int[] a1 = new int[20]
Inicjalizacja tablic Tablica obiektów Przy tablicach obiektów po wpisaniu komendy Obiekty[] a = new Obiekty[rand.nextInt(20)] W celu utworzenia tablicy, inicjalizacja nie jest kompletna, gdyż otrzymamy tylko tablice referencji, dopóki same referencje nie zostaną zainicjalizowane przez stworzenie nowych obiektów typu Obiekty a[i] = new Obiekty(rand.nextInt(4))
Inicjalizacja tablic Tworzenie tablic wielowymiarowych int[][] a1 = { {1, 2, 3, }, {4, 5, 6, }, }; int[][][] a2 = new int[2][2][4]; Tworzenie tablicy wielowymiarowej obiektów Integer[][] a3 ={ { new Integer(1), new Integer(2), }, { new Integer(3), new Integer(4), }, { new Integer(5), new Integer(6), }, };
KONIEC