Constructor (yapılandırıcı) çağırma sırası , işin içine inheritance (kalıtım) ve polimorfizm girdikten sonra epey karmaşık bir hal almaktadır . Constructor (yapılandırıcı) çağırma sırası , işin içine inheritance (kalıtım) ve polimorfizm girdikten sonra epey karmaşık bir hal almaktadır . Türemiş class ın yapılandırıcı metodunun çağırmadan evvel ana class ın tüm değişkenlerinin ilk değerlerini aldığından emin olmak gerekir aksi takdirde türemiş class da sorunlarla karşılaşabiliriz . Bu mantıkla yola çıkarsak , ana class ın yapılandırıcı metodu her zaman türemiş class ın yapılandırıcı methodundan daha önce çağrılır diyebiliriz. Eğer ana class ın argument alan bir yapılandıcı methodu varsa o zaman türemiş class ın yapılandırıcı methodunun ilk satırında super anahtar kelimesi ile ana class ın yapılandırıcı methodunu çağırmanız gerekmektedir.
Örnek :
// ilk deger verme sirasi
class A
{
static String degisken_bir = A.prt("static");
String degisken_iki = A.prt("non-static");
public A(int x) {
System.out.println("A constructor() " + x) ;
}
static String prt(String mesaj ) {
System.out.println("aaaaaa = " + mesaj);
return "a" ;
}
}
class B extends A
{
static String degisken_bir = B.prt("static");
String degisken_iki = B.prt("non-static");
public B() {
super(5) ;
System.out.println("B constructor()");
}
static String prt(String mesaj ) {
System.out.println("bbbbbb = " + mesaj);
return "a" ;
}
}
public class Extends
{
public static **** main(String[] args) {
new B();
}
}//^
ilk olarak new B() ile B objesi oluşturulduğu anda olaylar zincirleme olarak şöyle gelişir :
ilk etapda static olan değişkenlere ilk değerleri verilir . ilk olarak A class ındaki static değişken değer alır daha sonra B class ındaki static değişken değer alır .
Örneğin eğer A class ıda H class ından türeseydi ve H class ında da static bir değişken olsaydı o zaman ilk önce H class ındaki static değişkene değeri verilecekti daha sonra A class sındaki static değişkene değeri verilecekti ve son olarak da B class ındaki static değişkene değeri verilirdi . Kısaca static değişkenlere değer verme (initialize) sırası en üsteki class dan başlayarak en aşagıya doğru devam eder .
Daha sonra static-olmayan değişkenlerin ilk değer alma töreni başlar . Bu örnekte en tepede olan A class ına gelinir ve A class ının yapılandırıcı methoduna girilmeden , static-olmayan değişkenelere ilk değerleri verilir , sonra A class nın yapılandırıcı methoduna girilir .Fakat A class ının yapılandırıcı metodu nun argument aldığı görülür (default constructor değil ) ve B class ının yapılandırıcı methodunun ilk satırı dikkate alınarak A objesi oluştrulur ( super(5) ). Nihayet sira B class ının static-olmayan değişkenlerinin ilk değer almasına gelir .Bu işlemde tamamlandıkdan sonra B class ının yapılandırıcı metodunun içine girilir .
Programın çıktısı :
aaaaaa = static
bbbbbb = static
aaaaaa = non-static
A constructor() 5
bbbbbb = non-static
B constructor()
Örnek :
// ilk deger verme sirasi
class A
{
static String degisken_bir = A.prt("static");
String degisken_iki = A.prt("non-static");
public A(int x) {
System.out.println("A constructor() " + x) ;
}
static String prt(String mesaj ) {
System.out.println("aaaaaa = " + mesaj);
return "a" ;
}
}
class B extends A
{
static String degisken_bir = B.prt("static");
String degisken_iki = B.prt("non-static");
public B() {
super(5) ;
System.out.println("B constructor()");
}
static String prt(String mesaj ) {
System.out.println("bbbbbb = " + mesaj);
return "a" ;
}
}
public class Extends
{
public static **** main(String[] args) {
new B();
}
}//^
ilk olarak new B() ile B objesi oluşturulduğu anda olaylar zincirleme olarak şöyle gelişir :
ilk etapda static olan değişkenlere ilk değerleri verilir . ilk olarak A class ındaki static değişken değer alır daha sonra B class ındaki static değişken değer alır .
Örneğin eğer A class ıda H class ından türeseydi ve H class ında da static bir değişken olsaydı o zaman ilk önce H class ındaki static değişkene değeri verilecekti daha sonra A class sındaki static değişkene değeri verilecekti ve son olarak da B class ındaki static değişkene değeri verilirdi . Kısaca static değişkenlere değer verme (initialize) sırası en üsteki class dan başlayarak en aşagıya doğru devam eder .
Daha sonra static-olmayan değişkenlerin ilk değer alma töreni başlar . Bu örnekte en tepede olan A class ına gelinir ve A class ının yapılandırıcı methoduna girilmeden , static-olmayan değişkenelere ilk değerleri verilir , sonra A class nın yapılandırıcı methoduna girilir .Fakat A class ının yapılandırıcı metodu nun argument aldığı görülür (default constructor değil ) ve B class ının yapılandırıcı methodunun ilk satırı dikkate alınarak A objesi oluştrulur ( super(5) ). Nihayet sira B class ının static-olmayan değişkenlerinin ilk değer almasına gelir .Bu işlemde tamamlandıkdan sonra B class ının yapılandırıcı metodunun içine girilir .
Programın çıktısı :
aaaaaa = static
bbbbbb = static
aaaaaa = non-static
A constructor() 5
bbbbbb = non-static
B constructor()