Görsel 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();