Kalıtım ve finalize() Methodu

CorsaiR

Emektar
27 Ara 2005
1,228
18
Çekirdekten
Eğer yeni oluşturduğunuz class ınızda composition yöntemi ile diğer class ları kullanmışsanız , bu kullanılan class ların finalize() methodlarının çağrılmasını hakkında herhangi bir endişemiz olamaz .Fakat işin içine kalıtım girerse işler biraz renk değiştirir, şöyleki ; eğer türemiş bir class ın finalize() methodunun içinden ana class ının finalize() methodunu çağırmadınız sürece , ana class ın finalize() methodu çağrılmaz . Bunun sebebi , ilk olarak türetilmiş class ın yok olması gerektiğindendir . Ana class , türemiş class dan daha önce hafısazan silinirse , birçok hata ile karşılaşmamız mümkün.

Aşağıdaki örnekte türemiş class ın finalize() methodunun içinde ana class ın finalize methodu çağılmadı ve bakin ortaya nasil ilginç bir görüntüler çıktı

Program :

// kalitim ve finalize - I
class Vitamin
{
private String isim ;
public Vitamin(String gelen) {
isim = gelen ;
System.out.println("Vitamin yapilandirici "+ isim);
}

public **** finalize() { System.out.println("Vitamin finalize() "+isim ); }
}

class Bugday
{
Vitamin a = new Vitamin("Bugday");
public Bugday() { System.out.println("Bugday yapilandirici"); }

protected **** finalize() throws Throwable {
System.out.println("Bugday finalize()");
}
}

class Un extends Bugday
{
Vitamin a = new Vitamin("Un");
public Un() { System.out.println("Un yapilandirici"); }

protected **** finalize() throws Throwable {
System.out.println("Un finalize()");
}
}

class Ekmek extends Un
{
Vitamin a = new Vitamin("Ekmek");
public Ekmek() { System.out.println("Ekmek yapilandirici"); }

protected **** finalize() throws Throwable {
System.out.println("Ekmek finalize()");
}
}

public class Firinci
{
public static **** main(String args[]) {

new Ekmek();
System.out.println("Temizlik Basliyor .. ");
System.gc();
}
}//^

Programın çıktısı :

Vitamin yapilandirici Bugday
Bugday yapilandirici
Vitamin yapilandirici Un
Un yapilandirici
Vitamin yapilandirici Ekmek
Ekmek yapilandirici
Temizlik Basliyor ..
Ekmek finalize()
Vitamin finalize() Bugday
Vitamin finalize() Un
Vitamin finalize() Ekmek

Constructor (yapilandirici) methodlar daha evvelden değindiğimiz gibi sırasıyla çağrılıyor bu kısımları geçiyorum , dikkatinizi “Temizlik Baslıyordan” sonraya çekmek istiyorum

Temizlik Basliyor ..
Ekmek finalize()
Vitamin finalize() Bugday
Vitamin finalize() Un
Vitamin finalize() Ekmek


System.gc() komutu ile Garbage Collector tetiklendi , eğer bu komut çağrılmasaydı belkide hiç bir obje hafızandan temizlenmiyecekti (sadece tahmin) çünki Garbage Collector , hafızanın doluluk oranına göre çağrılır . Eğer bizim yazdığımız kod çok fazla çöp obje üretmiyorsa(hafızayı şişirmiyorsak) o zaman GC devreye hicbir zaman girmeyebilir ve tabii o zaman da finalize metoduda çağrılmaz.

Ekmek objesinin finalize() methodu ve kullanığımız üç adet vitamin objesinin finalize() methodları çağrıldı . Bu üç adet vitamin objesinin finalize() methodlarının çağrılmasının sebebi daha evvelden belirttiğim gibi composition yöntemi ile class lara dahil edilmeleri . Peki neden Bugday ve Un objelerinin finalize() methodları çağrılmadı?? Bunun sebebi , Ekmek class ının finalize() metodunda bizim manuel olarak bu class ların finalize() metodlarını çağırmamızdan kaynaklanıyor . Java bu olayda kontrolu bize vermişdir . Kural şöyle : Eğer türemiş class ın varsa , türetilen class ın finalize() methodunu çağırmak senin sorumluluğundadır.
Bir objenin finalize() methodunun çağrılması onun hafızadan atılması anlamına geldiğini daha evvelki konulardan biliyorduk .

Yani ?? , türetilen class ın finalize() methodunun çağrıldığı şekilde yukarıdaki örneği değiştirelim . Objelerin hafızadan silenmesi sıralamasına bakaranız , yaratılma sırasının tam tersi olduğunu göreceksiniz .



Dediklerimizi Kod a dökersek :


// kalitim ve finalize - II
class Vitamin
{
private String isim ;
public Vitamin(String gelen) {
isim = gelen ;
System.out.println("Vitamin yapilandirici "+ isim);
}

public **** finalize() { System.out.println("Vitamin finalize() "+isim ); }
}

class Bugday
{
Vitamin a = new Vitamin("Bugday");
public Bugday() { System.out.println("Bugday yapilandirici"); }

protected **** finalize() throws Throwable {
System.out.println("Bugday finalize()");
}
}

class Un extends Bugday
{
Vitamin a = new Vitamin("Un");
public Un() { System.out.println("Un yapilandirici"); }

protected **** finalize() throws Throwable {
System.out.println("Un finalize()");
super.finalize();
}
}

class Ekmek extends Un
{
Vitamin a = new Vitamin("Ekmek");
public Ekmek() { System.out.println("Ekmek yapilandirici"); }

protected **** finalize() throws Throwable {
System.out.println("Ekmek finalize()");
super.finalize();
}
}

public class Firinci2
{
public static **** main(String args[]) {

new Ekmek();
System.out.println("Temizlik Basliyor .. ");
System.gc();
}
} //^


Ekmek ve Un class larının finalize() metodlarına dikkat edelim . Artik super.finalize() sayesinde türetilen objeninde finalize() methodu da çağrılıyor.Yangın en aşağıdan başlayarak başayalarak en yukarıdaki class doğru ilerleyebilir .

Programın çıktısı :

Vitamin yapilandirici Bugday
Bugday yapilandirici
Vitamin yapilandirici Un
Un yapilandirici
Vitamin yapilandirici Ekmek
Ekmek yapilandirici
Temizlik Basliyor ..
Ekmek finalize()
Un finalize()
Bugday finalize()
Vitamin finalize() Bugday
Vitamin finalize() Un
Vitamin finalize() Ekmek
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.