2) SINIFLAR
Java dilinde programlamanin esasi sinif olusturmaktir. Giris bolumunde de anlatildigi gibi sinf(class) dedigimiz sey icinde bazi metod ve durum degiskenlerini kapsayan kod parcasidir. Her bir nesne belli bir siniftan meydana gelir. Bu sebepten dolayi siniflar nesnelerin turedigi tipler olarak dusunulur; sinirsiz sayida sinif yazma imkani oldugu icin Java dilinde istedigimiz kadar yeni tip meydana getirebiliriz.Java dilinde bir sinifin genel tanimi asagidaki gibidir :
[Public|Private|Final|Abstract] Class [Sinif_Adi]
{
[Sinifa Ait Kodlar]
}
Bir Java sinifinin icinde nitelik(instance variable), method ve olay yordamlari bulunur. Nitelik dedigimiz sey sinifin durumunu ifade eden genel veya yerel degiskenlerdir. Method sinifa ait hareketleri ve bunlarin nasil gerceklestirilecegini ifade eder. Bu sinifi kullanacak olan bir kullanici(client) bir metodun istenen bir isi nasil gerceklestirecegini bilmek zorunda degildir. Sadece ne yaptigini ve prototipini bilmesi metodu kullanmasi icin yeterlidir. Nesneye yonelik programlamaya ait bu ozellik soyutlama(abstraction) olarak adlandirilir. Bir java sinifina ait ucuncu bir uye vardir. Bu uye sinifin uzerine etki edebilecek olaylar karsisinda aktif hale gelen olay yordamlaridir ve gorsel programlamanin temelini olusturmaktadir.Sinifa ait uyelerin etki alanlari vardir. Bu erisim alanlari; Public, Private ve Protected anahtar kelimeleriyle tanimlanir. Public olarak tanimlanan uyeler hem sinif icinde, hem de bu sinftan turetilen nesneler yoluyla istemciler tarafindan kullanilabilir. Yani sinifin disariya sunmus oldugu servislerdir. Private tanimlanan uyeler ise sadece tanimlandigi sinif icinde kullanilabilir, bu uyelere disardan direkt erisim yoktur, ancak Public uyeler uzerinden erisim saglanabilir. Private uyeler bilgi saklama(information hiding) dedigimiz kavrama hizmet ederler. Bunlarin disinda Java dilinde ozel bir erisim tanimi olan Protected, Public ve Private erisimler arasinda gecis teskil eder. Sinif icinde Protected olarak tanimlanan uyeler superclass'in methodlari, subclass'in methodlari ayni paketteki diger siniflar tarafindan kullanilabilir.
public class Merhaba()
{
public int X;
public int Y;
private int Z;
protected String kelime;
public void Merhaba()
{
System.out.println(kelime);
X=10;
Y=20;
}
}Ornek 2-1 : Ornek bir Java sinifi
Giris bolumunde de anlatildigi gibi siniflar metod ve nitelikleri birbirinden miras alarak buyurler. Miras veren sinifa superclass, miras alana ise subclass denir. Ilk bakista celiski gibi gorunse de miras verene superclass denmesinin sebebi subclass'tan turetilen her bir nesnenin ayni zamanda superclass'in da bir nesnesi olmasidir. font>
bir dikdortgen sinifi dortgen sinifini inherit etmis(miras almis durumdadir). Bu yuzden dikdortgen sinifindan turetilen her bir nesne ayni zamanda dortgen sinifina da ait bir nesnedir.
Nesneler arasindaki kalitim iliskileri agac tipli hierarsik yapilar ortaya cikarir. Bu yapidaki superclass'lar ustte, sub classlar altta yer alir. Eger sinif yalniz basina kullaniliyorsa superclass, subclass gibi nitelikler almaz, bu nitelikler sinif hierarsi yapisinin icinde kullaniliyorsa gereklidir.
Sekil-1 : Universite Mensuplari Hierarsi Semasi
Bir Subclassa ait nesne superclass'a ait bir nesne gibi islem gorur. Bu ozellik cogu zaman yararli manipulasyonlar yapmamizi saglar. Ornegin ayni superclass'tan tureyen farkli subclass nesneleri bu ozellik kullanilarak tek bir arrayin elemanlari olabilirler. Aradaki cevrim gizli olarak yapilir.
Onemli Not : Fakat bir superclass nesnesi otomatik olarak bir subclass nesnesi olarak degerlendirilemez. Boyle bir degerlendirme bir syntax hatasina yol acar. Ancak programci, bir superclass referansini bir subclass referansina donusturmek icin acik bir deyim(cast) kullanabilir. Bu kullanim sekli ancak superclass referansi bir subclass nesnesini isaret ederken yapilabilir. Aksi taktirde Java ClassCastException hatasi verecektir.
Java Dilindeki Subclass ve Superclass Iliskileri Ornekleri Icin Tiklayiniz !
Constructor-Finalizer Kavramlari ve Bunlarin Subclasslarda Kullanimi :
Bir siniftan bir nesne yaratildiginda implicit olarak calisan ve bu nesneye ait baslangic islemlerini yapan sinif metoduna constructor adi verilir. Ayni sinif icinde parametreli ve parametresiz olmak uzere iki adet constructor tanimlanabilir. Parametresiz constructor sinifin varsayilan(default) constructor'idir.
Finalizer ise nesne implicit veya explicit olarak yokedilecegi zaman calisan nesneye ait metottur.
Ornek : Asagida bir nokta nesnesine ait constructor ve finalizer metodlari gorulmektedir.public class Nokta
{
protected int x,y;//parametresiz constructor
public point()
{
setPoint(0,0);
System.out.println("Nokta constructor : "+ toString());
}//parametreli constructor
public point(int a,int b)
{
setPoint(a,b);
System.out.println("Nokta constructor : "+ toString());
}//finalizer
protected void finalize() throws Throwable
{
System.out.println("Nokta Finalizer :
super.finalize();
}public void setPoint(int a, int b)
{
x=a;
y=b;
}public String toString()
{
return "["+ x + ", " + y + "]";
}
}
Ornek 2-2 : Constructor ve Finalizer Methodlarinin Kullanimi
Ornek 2-2'de goruldugu gibi bir sinifa ait construcor metodu sinifin ismini alir. Eger bu siniftan bir nesne yaratilirken parametre verilmezse parametresiz constructor sinifi, parametre verilirse parametreli constructor sinifi calisir. Ornekte nesneye ait finalizer metodu degisik bir prototipte tanimlanmistir. Bunun sebebi bu metodun Object ana sinifinda bu sekilde tanimlanmis olmasi, ve bu siniftaki metodun aslinda o metodu override etmesidir. Bu prototipin aciklamasi bu asamada bizim icin onemli degildir. Bizim bilmemiz gereken finalize metodlarinin bu sekilde yazilacagidir.
Simdiye kadar anlatilan constructor-finalizer kavramlari tek bir sinifli durumlar icindir . Oysa OOP'da siniflar cogu kez bir hierarsi icinde subclass-superclass mantigi icinde kullanilir. Bir subclass'tan bir nesne turetildiginde ilk olarak bu subclassa ait superclass'in constructor metodunu cagirmasi gerekir. Bunu saglamak icin superclass referansi acik olarak cagrilabilir(bak.aciklama-1); eger bu yapilmazsa subclass'a ait constructor metodu superclass'in default constructor'ini implicit olarak cagiracaktir.
Subclass uzerinden superclass constructor'ini cagirmanin yolu 'super()' deyimini kullanmaktan gecer.Eger subclass'ta superclass constructor'i explicit olarak cagrilmazsa bu durumda superclass'in default constructor'i implicit olarak calistirilir. Eger default constructor (parametresiz olan) mevcut degilse bu durumda bir syntax hatasi meydana gelir.
Aciklama-2 : Superclass constructorlari subclass constructorlari tarafindan miras alinmazlar. Bir subclass nesnesi yaratildigi zaman ilk olarak superclass constructor'i calisir, daha sonra subclass constructor'i calisir.
Finalizer Metodu : Constructorlardan farkli olarak bir sinifin bir tane finalizer metodu vardir. Bir subclass'in finalizer metodunun son statementi daima super.finalize() metodu olmalidir ki, superclass'in finalizer metodunun calismasi garantilensin.
Constructor ve Finalizer'larin Kullanimina Iliskin Ornekler Icin Tiklayiniz !
Superclass Nesnelerinin Subclass Nesnelerine Cevrimi :
Superclass nesnelerinin ayni zamanda bir subclass nesnesi olmasi gercegine ragmen, sub ve superclass nesnelerinin tipleri birbirinden farklidir. Subclass nesneleri superclass nesneleri gibi muamele gorebilir. Bunun sebebi subclass'ta superclass'taki her bir uyeye karsilik gelen bir uye bulunmasidir. Oysa bunun tersi dogru degildir; cunku bir superclass nesnesini subclass nesnesine atamak sadece subclass'ta bulunan uyeleri acikta birakacaktir.
Once bir subclass nesnesini bir superclass referansina atamak, daha sonra ise subclass'a ozgu uyeleri superclass referansi uzerinden kullanmak bir syntax hatasina yol acar.
Bir subclass nesnesi gizli olarak bir superclass nesnesine cevrilebilir, cunku kalitimdan dolayi bir subclass nesnesi ayni zamanda bir superclass nesnesidir. Superclass ve subclass referanslariyla superclass ve subclass nesnelerini eslestirmek ve karistirmak icin dort farkli yontem vardir :
- Bir superclass nesnesine superclass referansiyla erismek
- Bir subclass nesnesine subclass referansiyla erismek
- Bir subclass nesnesine superclass referansiyla erismek, cunku cevrim implicit olarak yapilir.
- Bir superclass nesnesine subclass referansiyla erismek ise syntax hatasina yol acar. Bu yol uygulanacak ise once subclass referansi casting islemine tabi tutulmalidir.
&n bsp;&n bsp; Index
![]()