Java Programlama Metot Yeniden Tanımlama, Metot Aşırı Yükleme, Dinamik Metot Yükleme, Soyut Sınıflar, Soyut Metotlar, Arayüzler, Çoklu Kalıtım, Anonim Sınıflar ve java.lang.Object 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); } Metot Yeniden Tanımlama (Method Override) (1/2) • • • • Alt sınıflar, temel sınıfın metotlarını miras alırlar Ancak bir alt sınıf isterse bir temel sınıf metotunu yeniden tanımlayabilir Alt sınıftaki metota, yeniden tanımlanmış metot (overridden method) denir Örnek: class SuperClass { void method() { } } void overriddenMethod() { } Metot Yeniden Tanımlama (Method Override) (2/2) • Örnek (devamı): class SubClass extends SuperClass { void overriddenMethod() { } } subClassObj.method(); // Temel sınıf metotu subClassObj.overriddenMethod(); // Alt sınıf metotu • Yeniden tanımlanmış metotun temel sınıftaki versiyonu «super» anahtar kelimesi kullanılarak alt sınıftan çağırılabilir • Örnek: super.overriddenMethod(); Örnek: Metot Yeniden Tanımlama (1/3) class A { int i, j; A(int a, int b) { i = a; j = b; } void show() { System.out.println("i and j: " + i + " " + j); } } Örnek: Metot Yeniden Tanımlama (2/3) class B extends A { int k; B(int a, int b, int c) { super(a, b); k = c; } void show() { System.out.println("k: " + k); } } Örnek: Metot Yeniden Tanımlama (3/3) class Override { public static void main(String args[]) { B subOb = new B(1, 2, 3); subOb.show(); // this calls show() in B } } Metot Aşırı Yükleme (Method Overloading) • İki metot aynı ismi taşıyorsa, ancak tip imzaları (type signatures) farklı ise metot aşırı yüklenmiş olur • Metotun yeniden tanımlanması için tip imzalarının da uyuşması gerekir • Aşırı Yükleme Örneği: void show() void show(String msg) Dinamik Metot Yükleme • Yeniden tanımlanmış bir metotun hangi versiyonunun çağırılacağı çalışma zamanında belirlenir • Java’da çalışma zamanı çok şekillilik (polymorphism) bu şekilde sağlanır • Hangi metotun çağırılacağı aşağıdaki prensiplere göre belirlenir: • Referans değişkenin tipinin ne olduğu önemli değildir • Referans gösterilen nesnenin tipi ne ise, o tipe ait sınıfın metotu çağırılır Örnek: Dinamik Metot Yükleme (1/2) class A { void callme() { System.out.println("Inside A's callme method"); } } class B extends A { void callme() { System.out.println("Inside B's callme method"); } } Örnek: Dinamik Metot Yükleme (2/2) A a = new A(); // object of type A B b = new B(); // object of type B A r; // obtain a reference of type A r = a; // r refers to an A object r.callme(); // calls A's version of callme r = b; // r refers to a B object r.callme(); // calls B's version of callme Problem: Şekiller ve Dinamik Metot Yükleme • Bir sonraki slaytta verilen Figure sınıfından türetilen Rectangle ve Triangle sınıflarını oluşturun • Bu sınıflardaki area() metodunu bu sınıflara uygun şekilde yeniden tanımlayın • Başka bir sınıf tanımlayarak, bu sınıfın main metodu içerisinde bu sınıfları kullanın. Çözüm: Şekiller ve Dinamik Metot Yükleme (1) class Figure { double dim1, dim2; Figure(double a, double b) { dim1 = a; dim2 = b; } double area() { System.out.println("Area for Figure is undefined."); return 0; } } Çözüm: Şekiller ve Dinamik Metot Yükleme (2) class Rectangle extends Figure { Rectangle(double a, double b) { super(a, b); } // override area for rectangle double area() { System.out.println("Inside Area for Rectangle."); return dim1 * dim2; } } Çözüm: Şekiller ve Dinamik Metot Yükleme (3) class Triangle extends Figure { Triangle(double a, double b) { super(a, b); } // override area for right triangle double area() { System.out.println("Inside Area for Triangle."); return dim1 * dim2 / 2; } } Çözüm: Şekiller ve Dinamik Metot Yükleme (4) Figure f = new Figure(10, 10); Rectangle r = new Rectangle(9, 5); Triangle t = new Triangle(10, 8); Figure figref; figref = r; System.out.println("Area is " + figref.area()); figref = t; System.out.println("Area is " + figref.area()); figref = f; System.out.println("Area is " + figref.area()); Çözüm: Şekiller ve Dinamik Metot Yükleme (5) Inside Area for Rectangle Area is 45 Inside Area for Triangle Area is 40 Area for Figure is undefined Area is 0 Soyut Sınıflar (Abstract Classes) • Bazen temel sınıflar gerçekleştirime uygun olmayabilir (Örn: Figure) • Soyut sınıflardan direk olarak nesne oluşturulamaz • Sadece alt sınıflarından nesne oluşturulabilir • Örnek: abstract class MyClass { } class SubClass extends MyClass { } MyClass myObject = new MyClass(); // Hata! MyClass myObject = new SubClass(); // Hata yok Örnek: Soyut Sınıflar (1/3) abstract class A { abstract void callme(); // concrete methods are still allowed in abstract classes void callmetoo() { System.out.println("This is a concrete method."); } } Örnek: Soyut Sınıflar (2/3) class B extends A { void callme() { System.out.println("B's implementation of callme."); } } Örnek: Soyut Sınıflar (3/3) class AbstractDemo { public static void main(String args[]) { B b = new B(); b.callme(); b.callmetoo(); } } Soyut Metotlar (Abstract Methods) • Gerçekleştirimi olmayan metotlardır • Örnek: abstract void abstractMethod(); • Soyut metotu bulunan sınıflar, soyut sınıf olarak tanımlanmalıdır • Soyut bir sınıfın alt sınıfı: • Ya miras ile alınan soyut metotları gerçekleştirir • Ya da soyut bir sınıf olabilir Soyut Metotu Olan Bir Sınıftan Alt Sınıf Oluşturmak • Örnek: abstract class AbstractClass { abstract void abstractMethod(); } class SubClass extends AbstractClass { void abstractMethod { // Miras ile alınan soyut metotun gerçekleştirimi } } Arayüzler (Interfaces) (1/2) • Java’da türetilen sınıfların sadece tek bir temel sınıfı olabilir • Çoklu kalıtım (multiple inheritence) arayüzler aracılığıyla sağlanır • Soyut sınıflar gibi, hangi fonksiyonları içerdiği belli ama gerçekleştirimi olmayan yapılardır • Tüm değişkenler public, static ve final tanımlıdır. Arayüzler (Interfaces) (2/2) • Tanımlanan tüm metotlar public tanımlıdır. • Yapıcı içeremezler. • Örnek: interface MyInterface { int field = 0; void interfaceMethod(); } Arayüz Gerçekleştirimi • Bir sınıf, arayüzdeki tanımlı metotları gerçekleştirerek, bir arayüzü gerçekleştirebilir • Örnek: class MyClass implements MyInterface { void interfaceMethod() { // arayüz metotunun gerçekleştirimi } } Arayüzler ve Soyut Sınıflar • Eğer arayüzü gerçekleştiren sınıf soyut bir sınıfsa, arayüz metotlarını gerçekleştirmeyebilir. • Bu durumda, arayüz metotları, soyut sınıfın alt sınıfları tarafından gerçekleştirilmelidir Çoklu Kalıtım (1/2) • Bir sınıf birden fazla arayüzü gerçekleştirebilir (çoklu kalıtım!) • Örnek: class MyClass implements FirstInterface, SecondInterface { void firstInterfaceMethod() { // FirstInterface arayüzündeki metotun gerçekleştirimi } void secondInterfaceMethod() { // SecondInterface arayüzündeki metotun gerçekleştirimi } } Çoklu Kalıtım (2/2) • Sınıf, birden fazla arayüzü gerçekleştirirken aynı zamanda bir temel sınıftan türeyebilir • Örnek: class MyClass extends MyBaseClass implements FirstInterface, SecondInterface { } void firstInterfaceMethod() { // FirstInterface arayüzündeki metotun gerçekleştirimi } void secondInterfaceMethod() { // SecondInterface arayüzündeki metotun gerçekleştirimi } Örnek: Arayüz Referanslarının Kullanımı (1/5) interface Callback { void callback(int param); } class Client implements Callback { // Implement Callback's interface public void callback(int p) { System.out.println("callback called with " + p); } } Örnek: Arayüz Referanslarının Kullanımı (2/5) class Client implements Callback { // Implement Callback's interface public void callback(int p) { System.out.println("callback called with " + p); } void nonIfaceMeth() { System.out.println("Classes that implement interfaces " + "may also define other members, too."); } } Örnek: Arayüz Referanslarının Kullanımı (3/5) class TestIface { public static void main(String args[]) { Callback c = new Client(); c.callback(42); } } Örnek: Arayüz Referanslarının Kullanımı (4/5) // Another implementation of Callback. class AnotherClient implements Callback { // Implement Callback's interface public void callback(int p) { System.out.println("Another version of callback"); System.out.println("p squared is " + (p * p)); } } Örnek: Arayüz Referanslarının Kullanımı (5/5) class TestIface2 { public static void main(String args[]) { Callback c = new Client(); AnotherClient ob = new AnotherClient(); c.callback(42); c = ob; // c now refers to AnotherClient object c.callback(42); } } Anonim Sınıflar (Anonymous Classes) • İsimsiz sınıflardır • Aynı anda, hem bir sınıfı tanımlamayı ve hem de bu sınıftan yeni nesne oluşturmayı sağlar • Var olan bir sınıftan türetilmeli ya da var olan bir arayüz gerçekleştirilmelidir • Diğer nesneye yönelik programlama dillerinde içsel sınıf (inner class) olarak adlandırılırlar Anonim Sınıf Kullanımı Sırasıyla: • new operatörü • Yeni sınıf türetilecek sınıfın ya da gerçekleştirilecek arayüzün adı • Yapıcı parametrelerini içeren parantezler • Arayüz imlementasyonu ise, içi boş parantezler • Anonim sınıfın içeriği • Temel sınıf ya da arayüz metotlarının (yeniden) gerçekleştirimi Anonim Sınıf Örneği (Arayüz Kullanarak) MyInterface anonymous = new MyInterface() { public void interfaceMethod() { // arayüz metotunun gerçekleştirimi } }; anonymous.interfaceMethod(); Gerçekçi Örnek - JavaFX public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); } java.lang.Object • Tüm sınıfların temel sınıfıdır • Tüm sınıflar Object sınıfının üyelerini miras alır (extends anahtar kelimesi?) boolean equals(Object obj) Nesnenin obj nesnesi ile aynı olup olmadığını kontrol eder. java.lang.Object – toString() metodu • Nesnenin String olarak açıklamasını döndürür • Bir nesne + operatörü kullanılarak bir string ile birleştirildiğinde otomatik olarak çağırılır • Alt sınıflar tarafından yeniden tanımlanabilir • Örnek: // aşağıdaki iki kullanım aynı sonucu üretir objString = "Nesne: " + myObject; objString = "Nesne: " + myObject.toString();