Yapıcı (Constructor)
Yazan : Şadi Evren ŞEKER
Nesne yönelimli programlama yaklaşımında bir nesnenin oluşturulması sırasında ilk çalışan fonksiyonun ismidir. Buna göre bir nesnenin oluşturulması demek, nesneyi tarif eden sınıftan bir türün hafızada (RAM) bir kopyası için yer açılması ve bu nesnenin bütün değişken ve metodlarının tanımlanan kısıtlamalarla erişilebilir olması demektir.
Bilindiği üzere nesne yönelimli programlamada bir nesnenin kendisi ve bir de nesneyi gösteren nesne atıfı (object referrer) bulunmaktadır. Nesne atıfı, içersidinde tanımlandığı nesne ile atıfta bulunduğu nesne arasında bir münasebet (aggregation) kurmaktadır. Yapıcı (constructor) ise nesnenin bizzatihi kendisinin oluşturulması sırasında çalışmaktadır. Aşağıdaki örnekte bu durumu inceleyelim:
class insan {
int boy;
public insan (){
boy = 180;
}
public insan ( int boy ) {
this.boy = boy;
}
}
class deneme{
public static void main(String args[]){
insan ali = new insan();
insan veli = new insan ( 170);
}
}
Yukarıdaki örnek kodda iki ayrı sınıf (class) JAVA dilinde kodlanmıştır. Buna göre ilk sınıfta (insan sınıfında) bir insanın boyu olduğu belirtilmiştir. Ayrıca insan’ın iki farklı yapıcısı (constructor) tanımlanmıştır. Bu yapıcılardan ilki parametre almazken (insan()) ikincisi bir tane int parametre almaktadır (insan (int boy)). Burada da görüldüğü üzere yapıcılar sınıf ile aynı isme sahip fonksiyonlardır (method) ve dönüş tipleri (Return type) yoktur, yani geri değer döndürmezler.
İkinci sınıf olan deneme sınıfında ise iki farklı nesne atıfı olan ali ve veli’nin içerisine iki farklı insan nesnesi oluşturularak verilmektedir. İlk nesnenin boyu 180 ve ikinci nesnenin boyu ise 170 olarak tanımlanmışt ve ilk nesneyi ali ikinci nesneyi veli göstermektedir.
mrh hocam yukarıdaki kodda this komutunu kullanmazsak sorun olur mu ve o this tam olarak ne yapıyor?*
this kullanmazsanız sorun olur. Kısaca durumu şöyle anlatabiliriz.
Kodda, yapıcı metodun içinde (yani insan sınıf içindeki insan fonksiyonunda) parametre olarak int boy isimli bir değişken tanımlanmış
public insan (int boy)
bu tanıma göre, metodun geçerlilik alanında boy isimli bir değişken tanımlı olacaktır.
Aynı zamanda sınıfın (class), yani insan sınıfının tanımında da bir adet int boy tanımı bulunmaktadır.
Bu tanım itibariyle, metodun geçerlilik alanında zaten boy isminde bir değişken tanımlanmış oluyor. Burada bir problem ortaya çıkıyor, aynı geçerlilik alanında iki adet aynı isme sahip değişken tanımlanmıştır. Bunlardan hangisine nasıl erişileceğini belirlememiz gerekir.
Metodun değişkenine erişilirken herhangi özel bir işleme gerek yoktur. Ancak sınıftaki tanıma (ki aslında sınıfta tanımlı olan değişken, nesnenin değişkenidir ve ancak bu sınıftan bir nesne oluşturulduğunda değişken ataması yapılabilir) değer atamak için this.boy demek gerekir.
Kısacası bahsi geçen metotta, sadece boy denilince metodun parametresi, this.boy denilince de sınıfın özelliğine erişilmektedi.
degiskenimiz boy olmayip x olsaydi, yani
public insan(int x){
this.boy = x;
}
bu sekilde mi olacakti?
**************
this kelimesi olusturdugumuz (sadece constructor icin)herhangi bir nesneyle ayni ozelliklere sahip degilmidir?farkli bir ozelligi var midir?
Saygilar…
ewet değişkenimizin ismi x olsaydı da this.boy=x diyebilirdiniz. Ama demiyebilirdiniz de. Yani bu durumda boy=x; demeniz yeterlidir çünkü bu alanda (blokta) tanımlı bir tane boy değişkeni olacaktı.
Yazıdaki örnekte yapıcı fonksiyonun içerisinde (constructor) iki farlı boy değişkeni tanımlıdır, birisi sınıfta tanımlı olan boy değişkeni diğeri fonksiyonda tanımlı olan parametre. Bu durumda ikisini ayırt etmek için this kelimesini kullanmak zorundayız. Sizin bahsettiğiniz durumda kullanım tercihe bağlıdır.
This kelimesinin kullanımına gelince. Kullanımı basitçe, anlamından anlaşılacağı üzere “bu” demektir.
Buradaki “bu” kelimesi, bu nesneyi ifade eder. Örneklememiz gerekirse, yukarıdaki insan sınıfını hatırlayalım. Bu sınıftaki herhangi bir değişkene değer atanamaz. (sınıfların sadece tanım yapılan yerler olduğu ve verinin nesnede tutulması gerektiğini hatırlayınız. Yani örneğin insanın boyu 180 olmaz ama Ali’nin boyu 180 olur. Dolayısıyla bir değişkenin değer kazanması için öncelikle sınıfımızdan bir nesne tanımlanması gerekir) Nesne oluşturulduktan sonra, sınıf tanımına uygun olarak değer alabilir. Örneğin insan sınıfından tanımlanan Ali nesnesinin boyunun 180 olması gibi.
İşte this kelimesinin kullanımı da tam bu noktada anlamlı hale gelir. Kodumuzdaki herhangi bir this kelimes, Ali nesnesini ifade etmektedir. Yani aslında this.boy denildiğinde ali.boy kastedilir. Öyleyse neden ali.boy demiyor da this.boy diyoruz diye sorulabilir. Bu sorunun cevabı da oldukça basit, henüz sınıfı yazarken, yapıcı fonksiyonları vs. tanımlarken nesnemizin ismini bilmiyoruz. Örneğin biz insan sınıfını kodluyoruz, ileride bu sınıftan hangi nesneler üretilecek bilmiyoruz, sınıfımızdan onlarca nesne üretilebilir, ismi ali olur veli olur sonuçta bu nesnelerin boy değişkenine erişilecekse, this.boy şeklinde erişilmelidir.
Ayrıca this kelimesi, fonksiyon olarak da kullanılabilir. Örneğin this(10); şeklindeki bir kullanım, yapıcı fonksiyon olan insan fonksiyonunu çağırarak, parametre olarak 10 değerini verir.
hocam bir class yarattıktan sonra client programda çalıştırınca cannot find symbol, constructor hatası veriyor.Hata nerde olabilir?Person person1= new Person(“……..”)
!hata burda
kodunuzu ve hata mesajını tam olarak yollamadığınız için ne yazık ki tam bir cevap veremeyiz. Ancak tahminen yapıcı fonksiyonlarınız arasında (constructors), dizgi alan (string) bir fonksiyon yoktur.
Yukarıdaki şekilde Person sınıfının aşağıdaki yapıcı fonksiyonları olmak zorundadır:
class Person{
Person(){ … }
Person(String s) { … }
}
teskkrler, güzel paylasım