1 / 23

Inicjalizacja i sprzątanie

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

glain
Download Presentation

Inicjalizacja i sprzątanie

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Inicjalizacja i sprzątanie Wykonał: Marcin Ganczarek 140544

  2. Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic

  3. Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic

  4. 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

  5. 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

  6. Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic

  7. 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

  8. 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); } }

  9. 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

  10. 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

  11. 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”); } }

  12. Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic

  13. 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

  14. 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

  15. 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

  16. Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic

  17. 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(); // … }

  18. 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

  19. Plan • Gwarantowana inicjalizacja przez konstruktor • Przeciążanie metod • Sprzątanie: finalizacja i odśmiecanie pamięci • Inicjalizacja składowych • Inicjalizacja tablic

  20. 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]

  21. 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))

  22. 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), }, };

  23. KONIEC

More Related