19 Constructor – 02

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.

One Comment
  1. Birkan

    Çok güzel elinize sağlık

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*
*