230 likes | 359 Views
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
E N D
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
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”); } } Gwarantowana inicjalizacja przez konstruktor Proste przykłady klas z konstruktorem
Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic
Przeciążanie metod 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”); } } Przykład klasy z przeciążonymi metodami
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
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), }, };