Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 58

bscribe to DeepL Pro to edit this document.

ww.DeepL.com/pro for more information.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
Bölüm 11 Kalıtım ve Çokbiçimlilik

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
2
Motivasyonlar
Daireleri, dikdörtgenleri ve üçgenleri modellemek
için sınıflar tanımlayacağınızı varsayalım. Bu
sınıfların birçok ortak özelliği var. Gereksizliği
önlemek için bu sınıfları tasarlamanın en iyi yolu
nedir? Cevap kalıtım kullanmaktır.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
3
Üst Sınıflar ve Alt Sınıflar
GeometricObject
-color: String The color of the object (default: white).
-filled: boolean Indicates whether the object is filled with a color (default: false).
-dateCreated: java.util.Date The date when the object was created.
+GeometricObject() Creates a GeometricObject.
+GeometricObject(color: String, Creates a GeometricObject with the specified color and filled
filled: boolean) values.
+getColor(): String Returns the color.
+setColor(color: String): void Sets a new color.
+isFilled(): boolean Returns the filled property.
+setFilled(filled: boolean): void Sets a new filled property.
+getDateCreated(): java.util.Date Returns the dateCreated.
+toString(): String Returns a string representation of this object.

Circle Rectangle
-radius: double -width: double
+Circle() -height: double
+Circle(radius: double) +Rectangle()
+Circle(radius: double, color: String,
filled: boolean)
+Rectangle(width: double, height: double)
+Rectangle(width: double, height: double
GeometricObject
+getRadius(): double color: String, filled: boolean)
+setRadius(radius: double): void +getWidth(): double Daire
+getArea(): double +setWidth(width: double): void
+getPerimeter(): double +getHeight(): double
+setHeight(height: double): void
Dikdörtgen
+getDiameter(): double
+printCircle(): void +getArea(): double
+getPerimeter(): double TestCircleRectangle
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
4
Bazı Notlar

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
5
Üst Sınıfların Yapıcıları Miras Alınır
mı?
Hayır. Onlar kalıtsal değildir.
Açıkça veya dolaylı olarak çağrılırlar.
Super anahtar sözcüğünü açıkça kullanarak.
Bir kurucu, bir sınıfın örneğini oluşturmak için
kullanılır. Özellikler ve yöntemlerin aksine, bir üst
sınıfın kurucuları alt sınıfta miras alınmaz. Yalnızca
super anahtar sözcüğü kullanılarak alt sınıfların
kurucularından çağrılabilirler. super anahtar sözcüğü
açıkça kullanılmazsa, üst sınıfın arg'siz kurucusu
otomatik olarak çağrılır.
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
6
Üst Sınıfın Kurucusu Her Zaman Çağrılır
Bir kurucu, aşırı yüklenmiş bir kurucuyu veya kendi üst
sınıfının kurucusunu çağırabilir. Bunlardan hiçbiri açıkça
çağrılmazsa, derleyici super() ifadesini kurucudaki ilk
ifade olarak koyar. Örneğin,

public A() { public A() {


is equivalent to
} super();
}

public A(double d) { public A(double d) {


// some statements is equivalent to
super();
} // some statements
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
7
Süper Anahtar Kelimeyi
Kullanma
super anahtar sözcüğü, içinde super
geçen sınıfın üst sınıfını ifade eder. Bu
anahtar sözcük iki şekilde kullanılabilir:
 Bir üst sınıf kurucusunu çağırmak için
 Bir üst sınıf yöntemini çağırmak için

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
8
DİKKAT

Üst sınıf kurucusunu çağırmak için super


anahtar sözcüğünü kullanmanız gerekir. Bir
üst sınıf kurucusunun adını bir alt sınıfta
çağırmak söz dizimi hatasına neden olur.
Java, super anahtar sözcüğünü kullanan
ifadenin kurucuda ilk olarak görünmesini
gerektirir.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
9
Yapıcı Zincirleme
Bir sınıfın örneğini oluşturmak, kalıtım zinciri boyunca tüm üst sınıfların
kurucularını çağırır. Bu, yapıcı zinciri olarak bilinir.
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
10
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte(); 1. Ana yöntemden
} başlayın
public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
11
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte(); 2. Fakülte
} kurucusunu çağırın
public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
12
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}
3. Employee'nin no-arg
class Çalışan extends Kişi {
public Çalışan() {
yapıcısını çağırın
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
13
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi { 4. Employee(String)


public Çalışan() { yapıcısını çağırın
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
14
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
5. Person() yapıcısını çağırın
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
15
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() { 6. println'i çalıştırın
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
16
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() { 7. println'i çalıştırın
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
17
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi {


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() { 8. println'i çalıştırın
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
18
animasyon
İzleme Yürütme
public class Fakülte extends Çalışan {
public static void main(String[] args) {
yeni Fakülte();
}

public Fakülte() {
System.out.println("(4) Fakültenin no-arg yapıcısı çağrıldı");
}
}

class Çalışan extends Kişi { 9. println'i çalıştırın


public Çalışan() {
this("(2) Employee'nin aşırı yüklenmiş kurucusunu çağır");
System.out.println("(3) Çalışanın no-arg yapıcısı çağrıldı");
}

public Çalışan(String s) {
System.out.println(s);
}
}

sınıf Kişi {
public Kişi() {
System.out.println("(1) Person'ın no-arg yapıcısı çağrıldı");
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
19
No-arg Yapıcısı Olmayan Bir Üst Sınıfın
Etkisi Üzerine Örnek
Programdaki hataları bulun:
public class Elma extends Meyve {
}

sınıf Meyve {
public Meyve(String isim) {
System.out.println("Fruit'in kurucusu çağrıldı");
}
}

Fruit'in bir no-arg yapıcısı yoktur

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
20
Alt Sınıf Tanımlama
Bir alt sınıf, bir üst sınıftan miras alır. Ayrıca şunları
da yapabilirsiniz:
 Yeni özellikler ekleyin
 Yeni yöntemler ekleyin
 Üst sınıfın yöntemlerini geçersiz kılın

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
21
Üst Sınıf Yöntemlerini Çağırma
Circle sınıfındaki printCircle() yöntemini aşağıdaki gibi yeniden
yazabilirsiniz:

public void printCircle() {


System.out.println("Daire oluşturuldu " +
super.getDateCreated() + " ve yarıçap " + yarıçap);
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
22
Üst Sınıftaki Yöntemleri Geçersiz Kılma
Bir alt sınıf, yöntemleri bir üst sınıftan miras alır. Bazen alt sınıfın,
üst sınıfta tanımlanan bir yöntemin uygulamasını değiştirmesi
gerekir. Bu, yöntem geçersiz kılma olarak adlandırılır.

public class Circle extends GeometricObject {


// Diğer yöntemler atlanmıştır

/** GeometricObject içinde tanımlanan toString yöntemini


geçersiz kılın */
public String toString() {
return super.toString() + "\nradius is " + radius;
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
23
NOT

Bir örnek yöntemi yalnızca erişilebilirse


geçersiz kılınabilir. Dolayısıyla, private bir
yöntem kendi sınıfı dışında erişilebilir
olmadığı için geçersiz kılınamaz. Bir alt
sınıfta tanımlanan bir yöntem üst sınıfta
private ise, iki yöntem tamamen ilişkisizdir.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
24
NOT

Bir örnek yöntem gibi, bir statik yöntem de


miras alınabilir. Ancak, statik bir yöntem
geçersiz kılınamaz. Üst sınıfta tanımlanan
bir statik yöntem bir alt sınıfta yeniden
tanımlanırsa, üst sınıfta tanımlanan yöntem
gizlenir.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
25
Overriding ve Overloading
public class Test { public class Test {
public static void main(String[] args) { public static void main(String[] args) {
A a = new A(); A a = new A();
a.p(10);
a.p(10.0);
10.0 a.p(10);
a.p(10.0);
10
}
} 10.0 }
} 20.0
class B { class B {
public void p(double i) { public void p(double i) {
System.out.println(i * 2); System.out.println(i * 2);
} }
} }

class A extends B { class A extends B {


// This method overrides the method in B // This method overloads the method in B
public void p(double i) { public void p(int i) {
System.out.println(i); System.out.println(i);
} }
} }

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
26
Nesne Sınıfı ve Yöntemleri
Java'daki her sınıf java.lang.Object sınıfından
türemiştir. Bir sınıf tanımlanırken kalıtım
belirtilmezse, sınıfın üst sınıfı Object'tir.

public class Circle { public class Circle extends Object {


... Equivalent
...
} }

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
27
Object içindeki toString()
yöntemi
toString() yöntemi, nesnenin bir dize temsilini döndürür.
Varsayılan uygulama, nesnenin bir örneği olduğu sınıf adı, at
işareti (@) ve bu nesneyi temsil eden bir sayıdan oluşan bir
dize döndürür.

Kredi kredi = yeni Kredi();


System.out.println(kredi.toString());

Kod, Loan@15037e5 gibi bir şey görüntüler. Bu mesaj çok


yararlı veya bilgilendirici değildir. Genellikle toString yöntemini,
nesnenin sindirilebilir bir dize gösterimini döndürmesi için
geçersiz kılmalısınız.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
28
Polimorfizm
Çok biçimlilik, bir üst tip değişkeninin bir alt tip
nesneye başvurabileceği anlamına gelir.

Bir sınıf bir tür tanımlar. Bir alt sınıf tarafından


tanımlanan bir türe alt tür, üst sınıf tarafından
tanımlanan bir türe ise üst tür denir. Bu nedenle,
Circle'ın GeometricObject'in bir alt türü
olduğunu ve GeometricObject'in Circle için bir
süper tür olduğunu söyleyebilirsiniz.

PolimorfizmDemo

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
29
Dinamik Bağlama
Dinamik bağlama aşağıdaki gibi çalışır: Bir o nesnesinin C ,
C , ..., C12n-1 ve Cn sınıflarının bir örneği olduğunu varsayalım;
burada C , C 'in bir alt sınıfıdır, C1223 , C'nin bir alt sınıfıdır, ... ve
C , Cn-1n 'un bir alt sınıfıdır. Yani, Cn en genel sınıftır ve C1 en özel
sınıftır. Java'da, Cn Object sınıfıdır. Eğer o bir p metodunu
çağırırsa, JVM p metodu için C , C , ..., C12n-1 ve Cn , bu sırayla,
bulunana kadar uygulamayı arar. Bir uygulama bulunduğunda,
arama durur ve ilk bulunan uygulama çağrılır.

Cn Cn-1 ..... C2 C1

Since o is an instance of C1, o is also an


Object instance of C2, C3, …, Cn-1, and Cn
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
30
Polimorfizm, Dinamik Bağlama ve Jenerik Programlama
public class PolimorfizmDemo {
public static void main(String[] args) {
m(new GraduateStudent()); m yöntemi Object türünde bir
m(new Student());
m(new Person()); parametre alır. Herhangi bir
}
m(new Object());
nesne ile çağırabilirsiniz.
public static void m(Object x) {
System.out.println(x.toString()); Bir alt tipteki nesne, süper tip değerinin gerekli
}
}
olduğu her yerde kullanılabilir. Bu özellik
class GraduateStudent extends Student { polimorfizm olarak bilinir.
}

class Öğrenci extends Kişi {


public String toString() {
"Öğrenci" olarak dön;
m(Object x) yöntemi yürütüldüğünde, x
}
} bağımsız değişkeninin toString yöntemi
çağrılır. x bir GraduateStudent, Student, Person
class Kişi extends Nesne {
public String toString() { veya Object örneği olabilir. GraduateStudent,
}
"Kişi" döndür;
Student, Person ve Object sınıfları toString
} yönteminin kendi uygulamalarına sahiptir.
Hangi uygulamanın kullanılacağı, çalışma
zamanında Java Sanal Makinesi tarafından
dinamik olarak belirlenir. Bu özellik dinamik
DynamicBindingDemo bağlama olarak bilinir.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
31
Yöntem Eşleştirme ve Bağlama
Bir yöntem imzasının eşleştirilmesi ve bir yöntem
uygulamasının bağlanması iki konudur. Derleyici,
derleme zamanında parametre türüne, parametre
sayısına ve parametrelerin sırasına göre eşleşen bir
yöntem bulur. Bir yöntem birkaç alt sınıfta
uygulanabilir. Java Sanal Makinesi, çalışma zamanında
yöntemin uygulamasını dinamik olarak bağlar.

odun kullanıcı ve/veya diğer yazılımlarla etkileşimi


k karmaşık bir meseleyi bağlamak!
işi asla JVM'ye bırakmayın: Önemli yöntemler için açık bir şekilde kod ya

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
32
Genel Programlama
public class PolimorfizmDemo {
public static void main(String[] args) {
Çok biçimlilik, yöntemlerin çok çeşitli
m(new GraduateStudent());
m(new Student());
nesne argümanları için genel olarak
m(new Person()); kullanılmasına olanak tanır. Bu, genel
m(new Object());
} programlama olarak bilinir. Bir yöntemin
public static void m(Object x) { parametre türü bir üst sınıfsa (örn. Object),
System.out.println(x.toString());
} bu yönteme parametrenin alt sınıflarından
}
herhangi birinden (örn. Student veya
class GraduateStudent extends Student {
}
String) bir nesne geçirebilirsiniz.
Yöntemde bir nesne (örneğin, bir Student
class Öğrenci extends Kişi {
public String toString() { nesnesi veya bir String nesnesi)
"Öğrenci" olarak dön;
} kullanıldığında, çağrılan nesnenin
}
yönteminin (örneğin, toString) özel
class Kişi extends Nesne {
public String toString() {
uygulaması dinamik olarak belirlenir.
"Kişi" döndür;
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
33
Döküm Nesneleri
Döküm operatörünü daha önce bir ilkel tipteki değişkenleri diğerine
dönüştürmek için kullandınız. Döküm aynı zamanda bir miras
hiyerarşisi içinde bir sınıf türündeki bir nesneyi diğerine
dönüştürmek için de kullanılabilir. Önceki bölümde, şu ifade
kullanılmıştır
m(new Student());

new Student() nesnesini Object türünde bir parametreye atar. Bu


ifade şu anlama gelir:

Object o = new Student(); // Implicit casting


m(o);
Örtük döküm olarak bilinen Object o = new
Student() ifadesi yasaldır çünkü bir Student örneği
otomatik olarak bir Object örneğidir.
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
34
Döküm Neden Gereklidir?
Aşağıdaki deyimi kullanarak o nesne referansını Student türündeki
bir değişkene atamak istediğinizi varsayalım:

Öğrenci b = o;

Bir derleme hatası meydana gelecektir. Neden Object o = new


Student() deyimi çalışıyor da Student b = o deyimi çalışmıyor?
Bunun nedeni, bir Student nesnesinin her zaman bir Object örneği
olması, ancak bir Object'in mutlaka bir Student örneği olmamasıdır.
Siz o'nun gerçekten bir Student nesnesi olduğunu görebilseniz de,
derleyici bunu bilecek kadar zeki değildir. Derleyiciye o'nun bir
Student nesnesi olduğunu söylemek için, açık bir döküm kullanın.
Sözdizimi, ilkel veri türleri arasında döküm yapmak için kullanılana
benzer. Hedef nesne türünü parantez içine alın ve aşağıdaki gibi
dökülecek nesnenin önüne yerleştirin:

Öğrenci b = (Öğrenci)o;
Liang, Introduction to Java// Açık döküm
Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
35
Dökümden
Üst Sınıftan Alt Sınıfa
Bir nesneyi bir üst sınıftan bir alt sınıfa aktarırken
açık döküm kullanılmalıdır. Bu tür bir döküm her
zaman başarılı olmayabilir.
Elma x = (Elma)meyve;

Portakal x = (Portakal)meyve;

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
36
instanceof Operatör
Bir nesnenin bir sınıfın örneği olup olmadığını test etmek için
instanceof operatörünü kullanın:

Object myObject = new Circle();


... // Bazı kod satırları
/** myObject bir Circle örneğiyse döküm işlemini
gerçekleştirin */
if (myObject instanceof Circle) {
System.out.println("Daire çapı " +
((Circle)myObject).getDiameter());
...
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
37
TIP
Atamayı anlamaya yardımcı olması için,
meyve, elma ve portakal benzetmesini, Fruit
sınıfının Apple ve Orange için üst sınıf
olduğunu düşünebilirsiniz. Elma bir
meyvedir, bu nedenle bir Apple örneğini
Fruit değişkenine her zaman güvenli bir
şekilde atayabilirsiniz. Ancak, bir meyve
mutlaka bir elma değildir, bu nedenle bir
Fruit örneğini bir Apple değişkenine atamak
için açık döküm kullanmanız gerekir.
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
38
Örnek: Polimorfizm ve Dökümün
Gösterilmesi
Bu örnek iki geometrik nesne oluşturur: bir daire
ve bir dikdörtgen, nesneleri görüntülemek için
displayGeometricObject yöntemini çağırır.
displayGeometricObject, nesne bir daire ise
alanı ve çapı görüntüler ve nesne bir dikdörtgen
ise alanı görüntüler.
CastingDemo

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
39
Bazı noktalar

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
40
Başka Bir Örnek
sınıf Hayvan {
void makeSound() {
System.out.println("Hayvan ses çıkarıyor...");
}
}
class Köpek extends Hayvan {
void makeSound() {
System.out.println("Köpek havlıyor...");
}
}
class Kedi extends Hayvan {
void makeSound() {
System.out.println("Kedi miyavlıyor...");
}
}

class TestPolymorphism2 {
public static void main(String args[]) {
Hayvan hayvan;

hayvan = yeni Köpek();


animal.makeSound();

hayvan = yeni Kedi();


animal.makeSound();
}
}

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
41
Neden?
Polimorfizmin Avantajları
Kod Yeniden Kullanılabilirliği: Polimorfizm, aynı isimli metotlar farklı sınıflarda kullanılabildiği için kodun yeniden
kullanımını sağlar.
Esneklik ve Dinamizm: Çok biçimlilik, bir nesnenin davranışının kullanıldığı bağlama bağlı olarak çalışma zamanında
değişebildiği daha esnek ve dinamik bir koda olanak tanır.
Azaltılmış Karmaşıklık: İlgili işlevler için aynı yöntem adının kullanılmasına izin vererek kodun karmaşıklığını azaltabilir,
kodun okunmasını ve bakımını kolaylaştırır.
Basitleştirilmiş Kodlama: Polimorfizm, yazılması gereken yöntem ve kurucu sayısını azaltarak kodlamayı basitleştirir.
Daha İyi Organizasyon: Çok biçimlilik, ilgili işlevleri tek bir sınıfta gruplandırarak kodun daha iyi düzenlenmesini sağlar.
Kod Genişletilebilirliği: Polimorfizm, mevcut kodu değiştirmeden üst sınıfın işlevselliğini genişletmek için yeni alt sınıflar
oluşturulabildiğinden kod genişletilebilirliğini sağlar.
Artan Verimlilik: Derleme zamanı çok biçimliliği daha verimli kodlamaya yol açabilir. Derleyici, kendisine iletilen
argümanların sayısına, türlerine ve sırasına bağlı olarak derleme zamanında çağrılacak uygun yöntemi seçebilir.

Java'da Polimorfizmin Dezavantajları


Karmaşıklık: Özellikle bir sınıf hiyerarşisinde aynı ada sahip birden fazla yöntem veya kurucu tanımlandığında bazen kodu
daha karmaşık hale getirebilir.
Hata ayıklama: Çalışma zamanında çalıştırılan metodu tam olarak izlemek zor olabileceğinden, polimorfik kodda hata
ayıklama daha zor olabilir.
Performans Ek Yükü: Çalışma zamanı çok biçimliliği, sistemin çalışma zamanında nesnenin gerçek türüne göre yürütülecek
yöntemi belirlemesi gerektiğinden bir performans ek yükü getirebilir.
Aşırı kullanım: Polimorfizmin aşırı kullanımı, kodda aşırı soyutlamaya ve gereksiz karmaşıklığa yol açabilir.
İsim Belirsizliği: Farklı metotlar veya kurucular için aynı ismin kullanılması isim belirsizliğine yol açarak kodun
anlaşılmasını zorlaştırabilir.
Esneklik: Derleme zamanı çok biçimliliği esnek olmayabilir, çünkü çalıştırılacak yöntem derleme zamanında kendisine
iletilen argümanların sayısına, türlerine ve sırasına göre belirlenir.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
42
Eşittir Yöntemi
equals() metodu, aşağıdakileri karşılaştırır
iki nesnenin içeriği. Object sınıfındaki equals yönteminin
varsayılan uygulaması aşağıdaki gibidir:
public boolean equals(Object obj) {
return this == obj;
}
Örneğin, equals
public boolean equals(Object o) {
if (o instanceof Circle) {
yöntemi Circle return yarıçap == ((Daire)o).yarıçap;
sınıfında }
geçersiz başka
false döndür;
kılınmıştır. }

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
43
NOT
== karşılaştırma operatörü, iki ilkel veri tipi
değerini karşılaştırmak veya iki nesnenin aynı
referansa sahip olup olmadığını belirlemek için
kullanılır. equals yöntemi, yöntemin nesnelerin
tanımlayıcı sınıfında değiştirilmiş olması
koşuluyla, iki nesnenin aynı içeriğe sahip olup
olmadığını test etmek için tasarlanmıştır. ==
işleci equals yönteminden daha güçlüdür, çünkü
== işleci iki referans değişkeninin aynı nesneye
atıfta bulunup bulunmadığını kontrol eder.
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
44
ArrayList Sınıfı
Nesneleri saklamak için bir dizi oluşturabilirsiniz. Ancak dizi
oluşturulduktan sonra dizinin boyutu sabitlenir. Java, sınırsız sayıda
nesneyi saklamak için kullanılabilecek ArrayList sınıfını sağlar.
java.util.ArrayList<E>
+ArrayList() Creates an empty list.
+add(o: E) : void Appends a new element o at the end of this list.
+add(index: int, o: E) : void Adds a new element o at the specified index in this list.
+clear(): void Removes all the elements from this list.
+contains(o: Object): boolean Returns true if this list contains the element o.
+get(index: int) : E Returns the element from this list at the specified index.
+indexOf(o: Object) : int Returns the index of the first matching element in this list.
+isEmpty(): boolean Returns true if this list contains no elements.
+lastIndexOf(o: Object) : int Returns the index of the last matching element in this list.
+remove(o: Object): boolean Removes the element o from this list.
+size(): int Returns the number of elements in this list.
+remove(index: int) : boolean Removes the element at the specified index.
+set(index: int, o: E) : E Sets the element at the specified index.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
45
Jenerik Tip
ArrayList, E genel türüne sahip genel bir sınıf olarak
bilinir. Bir ArrayList oluştururken E yerine somut bir
tür belirtebilirsiniz. Örneğin, aşağıdaki deyim bir
ArrayList oluşturur ve referansını cities değişkenine
atar. Bu ArrayList nesnesi dizeleri depolamak için
kullanılabilir.
ArrayList<String> şehirler = new
ArrayList<String>();
ArrayList<String> şehirler = new ArrayList<>();
TestArrayListesi
Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
46
Diziler ve ArrayList Arasındaki Farklar
ve Benzerlikler
Operation Array ArrayList

Creating an array/ArrayList String[] a = new String[10] ArrayList<String> list = new ArrayList<>();


Accessing an element a[index] list.get(index);
Updating an element a[index] = "London"; list.set(index, "London");
Returning size a.length list.size();
Adding a new element list.add("London");
Inserting a new element list.add(index, "London");
Removing an element list.remove(index);
Removing an element list.remove(Object);
Removing all elements list.clear();

DistinctNumbers

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
47
Dizilerden/Dizilere Dizi Listeleri
Bir nesne dizisinden ArrayList oluşturma:
String[] dizi = {"kırmızı", "yeşil", "mavi"};
ArrayList<String> liste = new
ArrayList<>(Arrays.asList(dizi));

Bir ArrayList'ten bir nesne dizisi oluşturma:


String[] dizi1 = yeni String[liste.size()];
liste.toArray(dizi1);

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
48
Dizi Listesinde max ve min
String[] dizi = {"kırmızı", "yeşil", "mavi"};
System.out.pritnln(java.util.Collections.max(
new ArrayList<String>(Arrays.asList(dizi)));

String[] dizi = {"kırmızı", "yeşil", "mavi"};


System.out.pritnln(java.util.Collections.min(
new ArrayList<String>(Arrays.asList(dizi)));

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
49
Dizi Listesini Karıştırma
Integer[] dizi = {3, 5, 95, 4, 15, 34, 3, 6, 5};
ArrayList<Integer> liste = new
ArrayList<>(Arrays.asList(dizi));
java.util.Collections.shuffle(liste);
System.out.println(liste);

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
50
Yığın Animasyonu
https://liveexample.pearsoncmg.com/dsanimation/StackeBook.html

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
51
MyStack Sınıfları
Nesneleri tutmak için bir yığın.

MyStack

MyStack
-list: ArrayList A list to store elements.
+isEmpty(): boolean Returns true if this stack is empty.
+getSize(): int Returns the number of elements in this stack.
+peek(): Object Returns the top element in this stack.
+pop(): Object Returns and removes the top element in this stack.
+push(o: Object): void Adds a new element to the top of this stack.
+search(o: Object): int Returns the position of the first element in the stack from
the top that matches the specified element.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
52
Korumalı Değiştirici
 protected değiştiricisi bir sınıftaki verilere ve
yöntemlere uygulanabilir. Genel bir sınıftaki
korumalı bir veriye veya korumalı bir yönteme,
alt sınıflar farklı bir pakette olsa bile, aynı
paketteki veya alt sınıflarındaki herhangi bir sınıf
tarafından erişilebilir.
 private, default, protected, public
Visibility increases

private, none (if no modifier is used), protected, public

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
53
Erişilebilirlik Özeti

Modifier Accessed Accessed Accessed Accessed


on members from the from the from a from a different
in a class same class same package subclass package

public

protected -

default - -

private - - -

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
54
Görünürlük Değiştiriciler
package p1;
public class C1 { public class C2 {
public int x; C1 o = new C1();
protected int y; can access o.x;
int z; can access o.y;
private int u; can access o.z;
cannot access o.u;
protected void m() {
} can invoke o.m();
} }

package p2;

public class C3 public class C4 public class C5 {


extends C1 { extends C1 { C1 o = new C1();
can access x; can access x; can access o.x;
can access y; can access y; cannot access o.y;
can access z; cannot access z; cannot access o.z;
cannot access u; cannot access u; cannot access o.u;
can invoke m(); can invoke m(); cannot invoke o.m();
} } }

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
55
Bir Alt Sınıf Erişilebilirliği Zayıflatamaz

Bir alt sınıf, üst sınıfındaki korumalı bir


yöntemi geçersiz kılabilir ve
görünürlüğünü public olarak değiştirebilir.
Ancak bir alt sınıf, üst sınıfta tanımlanan
bir yöntemin erişilebilirliğini zayıflatamaz.
Örneğin, bir yöntem üst sınıfta public
olarak tanımlanmışsa, alt sınıfta da public
olarak tanımlanmalıdır.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
56
NOT
Değiştiriciler sınıflar ve sınıf üyeleri
(veriler ve yöntemler) üzerinde kullanılır,
ancak final değiştiricisi bir yöntemdeki
yerel değişkenler üzerinde de
kullanılabilir. Final yerel değişkeni, bir
yöntemin içindeki sabittir.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
57
Son Değiştirici
 Son sınıf genişletilemez:
final class Math {
...
}

 Son değişken bir sabittir:


final statik çift PI = 3,14159;

 Nihai yöntem aşağıdaki gibi olamaz


alt sınıfları tarafından geçersiz kılınır.

Liang, Introduction to Java Programming and Data Structures, Twelfth Edition, Global Edition,
Copyright © 2022 Pearson Education Ltd. Tüm hakları saklıdır.
58

You might also like