Java Programlama

advertisement
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();
Download