Inicjalizacja i sprzątanie

Download Report

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