Polimorfik methodların , yapılandırıcı methodlar içersindeki ilginç davranışları

CorsaiR

Emektar
27 Ara 2005
1,228
18
Çekirdekten
Kalıtım sonuçu oluşan hiyerarşiler bazen ilginç ikilemlere sebebiyet verebilmektedirler . Kalıtım sonuçu oluşan hiyerarşi ler bazen ilginç ikilemlere sebebiyet verebilmektedirler . Örneğin bir abstract class ın yapılandırıcı methodunun
içinden , türemiş class tarafından ezilen bir method çağırılması mümkün. İlginç bir ve olmaması gereken bir durum .

Örnek :

// yapilandirici ve polimorfizm
// istenmeyen durum olusmasi

abstract class Motor {

protected abstract **** calistir();

public Motor() {
System.out.println("Motor Constructor");
calistir();
}

}

class Traktor extends Motor
{
int buji_sayisi = 1 ;

public Traktor(int bj ) {
this.buji_sayisi = bj ;
System.out.println("Traktor yapilandirici = " + buji_sayisi);
}

public **** calistir() {
System.out.println("Traktor --> calistir() = " + buji_sayisi );
}
}


public class Tarim
{
public static **** main(String[] args)
{
Traktor tr = new Traktor(5);

}
} //^

Yukarıdaki olayları sırasıyla açıklayalım :

1- Hafızan , obje için yer ayrılırken , objenin tüm değişkenlerine ilk değerleri verilir (class ın içinde sizin değişkenlere ilk değerlerini vermenizden farklı bir işlem olduğunu belirtmek isterim ). Eğer değişken ilkel bir tip ise int gibi sıfır değerini alır , eğer bir obje referansı ise null değerini alır.
2- Ana class ın yapılandırıcı metodu çağrılır . Bu yapılandırıcı method un içersinde ezilmiş (overriden ) olan calıstir() methodu çağrılır (Traktor classına ait olan calistir() ). Traktor class ın constructor methodundan bile önce calistir() methodu çağrılır (cok sakat bir durum). int bir değişken olan buji_sayisi , Traktor class ı içinde 1 ile ilk değerine almış olmasına rağmen , buji_sayisi en ilk değer olarak 0 (sıfır) değerini aldığını ekrana verdiği değerden görüyoruz .
3- Daha sonra diğer değişkenlerin ilk değerlerini alırlar .
4- Son olarak da türemiş olan class ın yapılandırıcı methodu çağrılır.


Programın çıktısı :

Motor Constructor
Traktor --> calistir() = 0
Traktor yapilandirici = 5


Yukarıdaki ekran çıktısı beklenmeyen ve istenmeyen bir program çıktısıdır.
Bu örneğin ana fikri şudur : yapılandırıcı metodların içersinde olabildiğince az diğer methodları çağırın . Eğer yapılandırıcılar içersinde metod çağıracaksanız , çağrılan methodların final veya private olmasına özen gösterin .

final ve private olan methodlar , başka methodlar tarafından ezilemezler(override). Böylece beklenmeyen durumlarla karşılaşmazsınız
 
Ü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.