Merhaba Arkadaslar,
Bu yazimda Java’ da Constructor/yapilandirici konusuna devam edecegim. ilk yazida temel yapidan bahsetmistim burada biraz daha detaya inecegiz.
Yapilandirici/ Constructor icin kurallar
- Yapilandiricilar private dahil tum access modifier /erisim belirteclerini kullanabilirler.
class B { private B() {} //private yapilandirici }
- Yapilandiricilarin ismiyle sinifin ismi anyi olmak zorundadir.
- Yapilandiricilarin donus tipi olamaz , void de olamaz.
- Bir sinifta sinif ismiyle ayni olacak sekilde metot tanimlanabilir. Bu durumda yapilandirici tanimlanmis olmaz.
public class A { void A() { // metot } A() { //yapilandirici } }
- Eger sinifimiz icin bir yapilandirici tanimlamazsak varsayilan yapilandirici olusturulur.
class C { // varsayilan yapilandirici otomatik olarak olusur }
- Varsayilan yapilandirici her zaman no-args/ arguman almayan yapilandiricidir.
- Yapilandiricinin access modifier/erisim belirteci ile sinifin erisim belirteci aynidir. Yani default ise default public ise publictir.
//bizim tanimladigimiz class C1 { } // compiler in gordugu class C1 { C() { super(); } } // bizim tanimladigimiz public class C1{ } //compilerin gordugu public class C1{ public C1() { super(); } }
- Eger no-args yapilandiriciyi da kullanmak istiyorsak ve kendimiz baska yapilandirilar tanimladiysak bu sefer otomatik olarak no-args yapilandirici olusmayacaktir. Bu yapilandirici da tanimlamamiz gerekmektedir.
class C { C(int var) { //varsayilan yapilandirici otomatik olusmaz } }
- Her yapilandiricinin ilk statement/ifadesi , this() veya super() olmak zorundadir.
class D { D() { System.out.println("Derleme Hatasi , super() her zaman ilk ifade olmalidir"); super(); } }
- this anahtar kelimesi ile overloaded/asiri yuklenmis yapilandiricilar cagrilabilir.
public class A { A() { this(10); } A(int x) { System.out.println(x); } public static void main(String[] args) { A a = new A(); } }
- Bir yapilandirici yukaridaki ornekte oldugu gibi sadece bir diger yapilandirici tarafindan cagrilabilir/invoke. Bir metot icerisinden cagrilamaz
public class A { A(int x) { System.out.println(x); } void method() { A(10); // derleme hatasi } }
- Bir yapilandirici hem this ile overloaded baska bir yapilandiriciyi hem super ile superclass’in yapilandiricisini cagiramaz.
class D { D() { this(10); super(); // derleme hatasi System.out.println("Derleme Hatasi"); } D(int i) { } }
- Birbirini rekursif olarak cagiran yapilandiricilar derleme hatasina neden olur.
public class A { A() { this(10); //derleme hatasi } A(int x) { this(); //derleme hatasi } }
- Abstract siniflar dahil tum siniflarin yapilandirici olmak zorundadir. Abstract siniflarin yapilandiricisi, abstract/soyut sinifi kalitan sinifin bir objesi yaratildiginda calistirilir. Onceki yazida belirttigim gibi zincirleme bir cagrilma yapisi soz konusudur.
abstract class Abs { Abs() { System.out.println("Abstract/soyut sinif yapilandirici"); } } public class A extends Abs { public static void main(String[] args) { A a = new A(); } }
- Arabirimlerin/interface yapilandiricisi yoktur.
interface Iface { Iface() { //derleme hatasi } }
- Yapilandiricilar kalitilmazlar, override edilmezler. Asiri yuklenebilirler /overloaded.
class Constructor { Constructor() { } Constructor(int i) { } Constructor(int i, int j) { } Constructor(String s, int j) { } }
Son olarak su kodu inceleleyelim ;
class Animal { Animal(String s) { } } class Horse extends Animal{ //derleme hatasi }
Derleme hatasi verecektir , cunku Horse sinifi Animal sinifini kalitmaktadir ve Horse sinifinin varsayilan yapilandiricisi super() anahtar kelimesini icermektedir, yani Animal sinifinin varsayilan yapilandiricini cagirmaktadir, fakat Animal sinifina ait varsayilan bir yapilandirici tanimlamadik.
Birkan
Çok güzel elinize sağlık