Upload
glain
View
45
Download
0
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
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
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”);}}
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 tablicTablica 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