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