extendsvesuperile bir alt sınıf oluşturmak- Bir metodu
@Overrideile geçersiz kılmak - Çok biçimliliği açıklamak ve
instanceofile tür kontrolü yapmak
Bir şirkette sıradan çalışanlar ve yöneticiler var. Hepsinin bir adı ve maaşı var, ama yönetici ayrıca prim de alıyor. Manager sınıfını sıfırdan yazıp Employee'nin bütün kodunu tekrarlamak yerine şunu diyebiliriz: “Yönetici de bir çalışandır, sadece biraz farklıdır.” Kalıtım tam olarak bunun içindir.
extends ve super
class Manager extends Employee yazımı, Manager'ın Employee'den türediğini belirtir: alt sınıf (subclass), üst sınıfın (superclass) alanlarını ve metotlarını alır. Alt sınıfın yapıcısı önce super(...) ile üst sınıfın yapıcısını çağırmalıdır. super.salary() ise metodun üst sınıftaki sürümünü çağırır.
public class Main {
public static void main(String[] args) {
Employee e = new Employee("Nigar", 1200);
Manager m = new Manager("Rashad", 2000, 500);
System.out.println(e.describe());
System.out.println(m.describe());
System.out.println(m.getName() + " earns " + m.salary());
}
}
class Employee {
protected String name;
protected double baseSalary;
Employee(String name, double baseSalary) {
this.name = name;
this.baseSalary = baseSalary;
}
String getName() { return name; }
double salary() { return baseSalary; }
String describe() {
return name + ": " + salary() + " AZN";
}
}
class Manager extends Employee {
private double bonus;
Manager(String name, double baseSalary, double bonus) {
super(name, baseSalary);
this.bonus = bonus;
}
@Override
double salary() {
return super.salary() + bonus;
}
}Nigar: 1200.0 AZN Rashad: 2500.0 AZN Rashad earns 2500.0
ManagersınıfındagetName()vedescribe()metotları yazılmamıştır ama çalışırlar; üst sınıftan miras alınmışlardır.salary()metodu geçersiz kılınmıştır (override): aynı ad ve parametreler, ama yeni bir davranış.- Dikkat:
describe()üst sınıfta yazılmıştır ama yönetici için 2500 gösterdi. Çünküsalary()çağrıldığında nesnenin gerçek sınıfındaki sürüm çalışır. protectedalanları alt sınıflar görebilir, dış kod (başka paketlerden) ise göremez.
Çok biçimlilik
Çok biçimlilik (polimorfizm), üst sınıf türündeki bir değişkenin herhangi bir alt sınıfın nesnesine başvurabilmesi ve bir metot çağrıldığında nesnenin gerçek sınıfındaki sürümün çalışması demektir. Aşağıda bir Shape dizisinde daireler ve dikdörtgenler var; döngü hangisinin hangisi olduğuna bakmadan area() çağırır ve her şekil alanını kendi bildiği gibi hesaplar.
public class Main {
static double round2(double x) {
return Math.round(x * 100) / 100.0;
}
public static void main(String[] args) {
Shape[] shapes = { new Circle(1), new Rectangle(3, 4), new Circle(2) };
double total = 0;
for (Shape s : shapes) {
System.out.println(s.name() + ": " + round2(s.area()));
total += s.area();
}
System.out.println("Total: " + round2(total));
}
}
class Shape {
String name() { return "Shape"; }
double area() { return 0; }
}
class Circle extends Shape {
private double r;
Circle(double r) { this.r = r; }
@Override String name() { return "Circle"; }
@Override double area() { return Math.PI * r * r; }
}
class Rectangle extends Shape {
private double w, h;
Rectangle(double w, double h) { this.w = w; this.h = h; }
@Override String name() { return "Rectangle"; }
@Override double area() { return w * h; }
}Circle: 3.14 Rectangle: 12.0 Circle: 12.57 Total: 27.71
Circle sınıfındaki formülle, yani π · r² ile karşılaştır. Diğer şekilleri de seç: her biri için ayrı bir alt sınıf yazılabilirdi.Çok biçimliliğin gücü şudur: yarın bir Triangle sınıfı eklersen main içindeki döngüyü hiç değiştirmen gerekmez. Kod belirli sınıflara değil, genel türe (Shape) bağlıdır. Büyük programlar tam olarak böyle büyür.
instanceof ile tür kontrolü
Bazen bir nesnenin belirli türünü bilmek gerekir. o instanceof String s ifadesi o'nun bir String olup olmadığını kontrol eder; öyleyse onu hemen s adlı bir String değişkenine yerleştirir. Bu yazım (pattern matching) Java 16'dan beri kullanılabilir.
public class Main {
public static void main(String[] args) {
Object[] things = { "Baku", 42, new Dog("Rex"), 3.5 };
for (Object o : things) {
if (o instanceof String s) {
System.out.println("String of length " + s.length());
} else if (o instanceof Dog d) {
d.bark();
} else {
System.out.println("Something else: " + o);
}
}
}
}
class Dog {
private String name;
Dog(String name) { this.name = name; }
void bark() { System.out.println(name + " says Woof!"); }
}String of length 4 Something else: 42 Rex says Woof! Something else: 3.5
Önemli noktalar
class B extends A—B,A'nın alanlarını ve metotlarını miras alır; Java'da bir sınıf yalnızca bir sınıftan türeyebilir.super(...)üst sınıfın yapıcısını,super.method()ise üst sınıfın metodunu çağırır.@Override, bir metodun gerçekten üst sınıftaki bir metodun yerine geçtiğini derleyiciye kontrol ettirir.- Çok biçimlilik: üst sınıf türündeki değişken alt sınıf nesnesine başvurur ve nesnenin gerçek sınıfındaki metot çalışır.
o instanceof Type ttürü kontrol eder ve nesneyi hemen yeni bir değişkene verir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.