Java Programlama Kalıtım, Temel/Alt Sınıf, Temel/Alt Sınıf Tip Dönüşümleri, Temel Sınıf Yapıcıları, super Anahtar Kelimesi, Sınıf Üyesi Görünürlüğü, Statik Üyeler ve Final Üyeler Sınıflar • Programcı tarafından tanımlanan veri tipleridir • Nesne: sınıfın bir örneğidir • Sınıf tanımı, sınıfın adında bir Java dosyası içerisinde yapılır: <SınıfAdı>.java • Sınıf adları geleneksel olarak büyük harfle başlar • Sınıf üyeleri: değişkenler (fields) and metotlar (methods) • Değişkenler: nesne içerisindeki değişkenlerdir • Temel veri tipi veya sınıf tipi • Metotlar: Java komutlarını içeren prosedürlerdir (functions?) Örnek: MyClass.java class MyClass { int myVariable; int getVariable() { return myVariable; } void setVariable(int value) { myVariable = value; } } Sınıf Üyelerine Erişim • Sınıfın içerisinden: • Değişkenin yada metotun adı kullanılarak erişilir. • Örnekler: myVariable = 0; setVariable(0); • Opsiyonel olarak, this anahtar kelimesi kullanılabilir, e.g. this.myVariable • Yerel değişkenler alanı gölgelediği durumda gereklidir • Dışarıdaki bir sınıftan: • Nesne değişkeni + . + alanın yada metotun adı Örnekler: myObject.myVariable = 0; myObject.setVariable(0); Alt Sınıflar (Subclasses) • Başka bir sınıftan türetilen sınıflardır • Türetildikleri sınıfa süper sınıf ya da temel sınıf (superclass or base class) denir • Alt sınıf, temel sınıfın özelliklerini genişletir • Temel sınıfın değişkenlerini ve metotlarını miras alır • Ek değişkenler veya metotlar tanımlayabilir • Kodların yeniden kullanımını kolaylaştırır • Bir alt sınıf, diğer bir sınıf tarafından temel sınıf olarak kullanılabilir. • Direk veya dolaylı temel sınıf alt sınıf ilişkisi • Kalıtım hiyerarşisi Temel Sınıf: MyClass.java class MyClass { int myVariable; int getVariable() { return myVariable; } void setVariable(int value) { myVariable = value; } } Alt Sınıf: MySubClass.java class MySubClass extends MyClass { } int subClassVariable; int getVariableSum() { return myVariable + subClassVariable; } void setVariables(int value) { subClassVariable = value; setVariable(value); } Örnek: Temel Sınıf ve Alt Sınıf – A Temel Sınıfı class A { int i, j; void showij() { System.out.println("i and j: " + i + " " + j); } } Örnek: Temel Sınıf ve Alt Sınıf – B Alt Sınıfı class B extends A { int k; void showk() { System.out.println("k: " + k); } void sum() { System.out.println("i+j+k: " + (i + j + k)); } } Örnek: Temel Sınıf ve Alt Sınıf – main metotu (1) A superOb = new A(); B subOb = new B(); // Temel sınıflar da kendi başına kullanılabilir superOb.i = 10; superOb.j = 20; System.out.println("superOb icerigi: "); superOb.showij(); System.out.println(); Örnek: Temel Sınıf ve Alt Sınıf – main metotu (2) // Alt sınıf üst sınıfın tüm public üyelerine erişebilir subOb.i = 7; subOb.j = 8; subOb.k = 9; System.out.println("subOb icerigi: "); subOb.showij(); subOb.showk(); System.out.println(); System.out.println("subOb icindeki i, j ve k nin toplami:"); subOb.sum(); Örnek: Renkli/Ağırlıklı Kutu Daha önce yazmış olduğunuz, genişlik, yükseklik ve derinlik özelliklerini içeren "Kutu" sınıfını temel sınıf olarak kullanacak, 1. tamsayı tipinde renk özelliğini de içeren "ColorBox" sınıfını oluşturup kullanınız 2. double tipinde ağırlık özelliğini de içeren "BoxWeight" sınıfını oluşturup kullanınız Örnek: Renkli/Ağırlıklı Kutu – Kutu Sınıfı class Box { double width; double height; double depth; Box(double w, double h, double d) { width = w; height = h; depth = d; } // hacim hesapla double volume() { return width * height * depth; } } Örnek: Renkli/Ağırlıklı Kutu – RenkliKutu Sınıfı class ColorBox extends Box { int color; // kutunun rengi ColorBox(double w, double h, double d, int c) { width = w; height = h; depth = d; color = c; } } Örnek: Renkli/Ağırlıklı Kutu – AgirlikliKutu Sınıfı class BoxWeight extends Box { double weight; // kutunun agirligi BoxWeight(double w, double h, double d, double m) { width = w; height = h; depth = d; weight = m; } } Örnek: Renkli/Ağırlıklı Kutu – Main Metotu BoxWeight mybox1 = new BoxWeight(10, 20, 15, 34.3); ColorBox mybox2 = new ColorBox(2, 3, 4, Color.BLACK); double vol; vol = mybox1.volume(); System.out.println("Volume of mybox1 is " + vol); System.out.println("Weight of mybox1 is " + mybox1.weight); System.out.println(); vol = mybox2.volume(); System.out.println("Volume of mybox2 is " + vol); System.out.println("Weight of mybox2 is " + mybox2.color); Temel Sınıf ve Alt Sınıf Nesneleri (1/2) • Alt sınıf nesneleri aynı zamanda temel sınıfın nesneleridir • Alt sınıf nesnesi, temel sınıf tipinde bir değişkene atanabilir • Temel sınıf nesnesi bir alt sınıf nesnesi olabilir ancak olmak zorunda değildir. • Temel sınıf nesnesi, alt sınıf tipindeki değişkene atanmadan önce, alt sınıf tipine çevrilmelidir: dinamik dönüşüm (dynamic cast) • Örnek: SuperClass superObject; SubClass subObject; // ... superObject = subObject; // Her zaman güvenli subObject = (SubClass) superObject; // Çalışma zamanı kontrolü Temel Sınıf ve Alt Sınıf Nesneleri (2/2) • Eğer temel sınıf nesnesi, alt sınıfın bir nesnesi değilse, dinamik dönüşüm çalışma zamanı istisnası (run-time exception) oluşturur • instanceof operatörü çalışma zamanında örnek tipini kontrol etmek için kullanılabilir • Örnek: if (superObject instanceof SubClass) subObject = (SubClass) superObject; // Güvenli Örnek: Alt Sınıf Değişkeninin Temel Sınıf Değişkenin Atanması (1) BoxWeight weightbox = new BoxWeight(3, 5, 7, 8.37); Box plainbox = new Box(); System.out.println("Volume of weightbox is " + weightbox.volume()); System.out.println("Weight of weightbox is " + weightbox.weight); System.out.println(); // assign BoxWeight reference to Box reference plainbox = weightbox; Örnek: Alt Sınıf Değişkeninin Temel Sınıf Değişkenin Atanması (2) vol = plainbox.volume(); // OK, volume() defined in Box System.out.println("Volume of plainbox is " + vol); /* * The following statement is invalid because * plainbox does not define a weight member. */ // System.out.println("Weight of plainbox is " + plainbox.weight); Temel Sınıfların Yapıcıları • Varsayılan yapıcılar kullanıldığında: alt sınıf yapıcısı, temel sınıf yapıcısı çağırıldıktan sonra çağırılır • Varsayılan yapıcı dışında bir yapıcı tanımlanmazsa, parametresi olmayan temel sınıf yapıcısı otomatik çağırılır • Varsayılan yapıcı dışındaki yapıcıları çağırmak için: super(...) • Örnek: SuperClass(int value) { } SubClass() { super(0); } • Temel sınıf yapıcısı çağırımı, alt sınıf yapıcısının ilk satırında yapılmalıdır Örnek: Temel Sınıf Yapıcısını Çağırma class BoxWeight extends Box { double weight; // weight of box // initialize width, height, and depth using super() BoxWeight(double w, double h, double d, double m) { super(w, h, d); // call superclass constructor weight = m; } } Örnek: Temel Sınıf Yapıcıları – super(...) kullanmaksızın (1/3) class A { A() { System.out.println("Inside A's constructor."); } } class B extends A { B() { System.out.println("Inside B's constructor."); } } Örnek: Temel Sınıf Yapıcıları – super(...) kullanmaksızın (2/3) class C extends B { C() { System.out.println("Inside C's constructor."); } } class CallingCons { public static void main(String args[]) { C c = new C(); } } Örnek: Temel Sınıf Yapıcıları – super(...) kullanmaksızın (3/3) Program Çıktısı: Inside A’s constructor Inside B’s constructor Inside C’s constructor • • • • super() kullanılmamasına rağmen, temel sınıfların varsayılan yapıcıları çağrıldı Madem yapıcı çağırılacak, neden super kullanalım? Farklı imzaya sahip yapıcıları çağırabilmek için Örnek: super(1, 2) Sınıf Üyesi Görünürlüğü • Bir sınıfın üyelerine diğer sınıflardan erişimi kontrol etmek için kullanılır • Varsayılan durum: sadece paket içi görünüm (package-private visibility) • Sınıf üyelerine sadece aynı paketteki sınıflardan erişilebilir • Açık Görünürlük (public visibility): • Sınıf üyelerine herhangi bir sınıf tarafından erişilebilir • Korumalı Görünürlük (protected visibility): • Sınıf üyelerine direk veya dolaylı alt sınıflar ve aynı paketteki sınıflar tarafından erişilebilir • Gizli Görünürlük (private visibility): • Sınıf üyelerine diğer sınıflardan erişilemez Sınıf Üyesi Görünürlüğü Örneği (1/4) com/company/firstpackage/FirstClass.java: package com.company.firstpackage; public class FirstClass { int myVariable; private int privateVariable; public void publicMethod() { } protected void protectedMethod() { } } Sınıf Üyesi Görünürlüğü Örneği (2/4) com/company/firstpackage/SecondClass.java: package com.company.firstpackage; class SecondClass { FirstClass firstObject; void method() { firstObject.myVariable = 0; firstObject.privateVariable = 0; firstObject.publicMethod(); // firstObject.protectedMethod(); // } } // Hata yok // Hata! Hata yok Hata yok Sınıf Üyesi Görünürlüğü Örneği (3/4) com/company/secondpackage/ThirdClass.java: package com.company.secondpackage; import com.company.firstpackage.FirstClass; class ThirdClass { FirstClass firstObject; void method() { firstObject.myVariable = 0; // Hata! firstObject.privateVariable = 0; // Hata! firstObject.publicMethod(); // Hata yok firstObject.protectedMethod(); // Hata! } } Sınıf Üyesi Görünürlüğü Örneği (4/4) com/company/secondpackage/FourthClass.java: package com.company.secondpackage; import com.company.firstpackage.FirstClass; class FourthClass extends FirstClass { FirstClass firstObject; void method() { firstObject.myVariable = 0; firstObject.privateVariable = 0; firstObject.publicMethod(); // firstObject.protectedMethod(); // } } // Hata! // Hata! Hata yok Hata yok Statik Üyeler (1/3) • Normal şartlarda, sınıf üyelerine (değişkenler ve metotlar), nesneler aracılığıyla erişilebilir • Örnekler: myObject.myField = 0; myObject.setField(0); • Ve sınıf üyeleri nesne değişkenleridir (instance variables): • obj1.field ve obj2.field iki farklı değişkendir Statik Üyeler (2/3) • Sınıfa ait üyelere statik üyeler (static fields) denir • Sınıf örneklerinden bağımsız üyelerdir • Sınıf değişkenleridirler: Sınıfın tüm nesneleri tarafından paylaşılırlar • Nesne adı yerine, sınıf adı kullanılarak erişilirler Statik Üyeler (3/3) • Örnek: class MyClass { static int staticVariable; static void staticMethod() { ... } } MyClass.staticVariable = 0; MyClass.staticMetohd(); • Görünürlük anahtar kelimeleri (public, protected, private): Statik olmayan üyeler için geçerli kurallar statik üyeler için de geçerlidir. Main Metotu • Bir Java programı çalıştırıldığında otomatik çalıştırılan metot: • public static void main(String[] args) • Parametre: Program çalıştırılırken gönderilen parametreleri içeren String dizisidir. (Eğer parametre gönderilmemişse boş dizi gönderilir.) • Örnek: public class HelloWorld { public static void main(String[] args) { If (args.length > 0) System.out.println(args[0]); } } Final Sınıflar Final sınıflardan alt sınıf oluşturulamaz final class MyClass { int field = 0; void method() { field = 1; } } Final Üyeler (1/2) • Final tanımlanan sınıf üyeleridir: metot veya değişken • Final metotlar alt sınıflarda yeniden tanımlanamazlar • Final değişkenler ise ilk değer atandıktan sonra değeri değiştirilemeyen sınıf üyeleridir • Bu nedenle, değerleri ilk değer atanırken verilmelidir (1) Değişken tanımlanırken - hem statik hem de statik olmayan üyeler için bu yöntem kullanılablir veya ... Final Üyeler (2/2) (2) Her bir yapıcının içerisinde ilk değer atanabilir - sadece statik olmayan üyeler için kullanılabilir class MyClass { final int finalField = 0; void method() { finalField = 1; // Hata! } }