Pelajaran modul (1/2)
Warisan
Warisan adalah mekanisme dasar OOP yang memungkinkan suatu kelas (disebut kelas anak atau subkelas) untuk mewarisi bidang dan metode dari kelas lain (disebut kelas induk atau superkelas).
Hal ini mendorong penggunaan kembali kode dan menghindari pengulangan yang tidak perlu.
Memperluas Kelas dengan extends
Di Java, kami menggunakan kata kunci extends untuk menunjukkan bahwa suatu kelas mewarisi kelas lain:
class Vehicle {
protected int speed; // 'protected' makes the field visible to subclasses
public void honk() {
System.out.println("Beep beep!");
}
}
class Car extends Vehicle {
// Car automatically inherits the speed field and the honk() method
}Konstruktor dan Kata Kunci super()
Jika superkelas memiliki konstruktor yang menerima parameter, subkelas harus memanggilnya secara eksplisit dalam konstruktornya menggunakan super(...) sebagai pernyataan pertama:
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
int studentId;
public Student(String name, int studentId) {
super(name); // Invokes the constructor of Person
this.studentId = studentId;
}
}Penggantian Metode (@Override)
Subkelas dapat menyediakan implementasi spesifiknya sendiri untuk metode yang diwarisi dari superkelas. Operasi ini disebut overriding (overriding metode) dan ditandai dengan anotasi @Override.
class Animal {
public void makeSound() {
System.out.println("Rumore generico");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miao!");
}
}Pengubah protected
Pengubah akses protected memainkan peran penting dalam pewarisan. Tidak seperti private, yang membuat anggota hanya terlihat dalam kelas yang sama, protected mengizinkan akses ke bidang dan metode baik dalam paket yang sama maupun oleh semua subkelas, meskipun mereka berada dalam paket yang berbeda.
Mengakses Anggota Induk dengan super
Selain memanggil konstruktor superkelas, kata kunci super dapat digunakan dalam metode subkelas untuk mereferensikan metode atau variabel kelas induk. Hal ini sangat berguna ketika suatu metode ditimpa, namun Anda masih ingin menjalankan perilaku induk asli:
class Animal {
public void sleep() {
System.out.println("Zzz");
}
}
class Cat extends Animal {
@Override
public void sleep() {
super.sleep(); // Executes the behavior of Animal
System.out.println("The cat purrs while sleeping.");
}
}Warisan Tunggal di Jawa
Di Java, sebuah kelas dapat diperluas hanya satu kelas (warisan tunggal). Warisan langsung dari beberapa kelas (multiple warisan) tidak diperbolehkan; misalnya, class Cat extends Animal, Mammal akan menyebabkan kesalahan kompilasi. Pilihan desain ini menghindari ambiguitas yang dikenal sebagai "masalah berlian" (ketika dua superclass mendefinisikan metode yang sama dengan implementasi berbeda). Untuk mengatasi keterbatasan ini, Java memperkenalkan konsep Interface, yang akan kita jelajahi di modul berikutnya.
Cobalah sendiri
Lengkapi subkelas Anjing dengan memperluas Hewan. Deklarasikan konstruktor Anjing yang menerima nama (String) dan menggunakan super(nama) untuk meneruskannya ke konstruktor Hewan.
Tunjukkan petunjuk
Tulis `Anjing publik(Nama string) { super(nama); }` di dalam kelas Anjing.
Solusi tersedia setelah 3 upaya
Perluas Anjing dari Hewan dan ganti metode makeSound() sehingga mengembalikan string Woof, bukan Suara Generik. Gunakan anotasi @Override.
Tunjukkan petunjuk
Tulis `@Override` di atas deklarasi `public String makeSound() { return 'Woof'; }` di dalam Anjing.
Solusi tersedia setelah 3 upaya
Deklarasikan kelas Cat yang memperluas Animal dan mengganti metode makeSound() untuk mengembalikan string Meow. Kelas Animal sudah memiliki konstruktor yang menerima nama; memastikan bahwa konstruktor Cat juga menerima nama dan meneruskannya dengan benar ke konstruktor superkelas.
Tunjukkan petunjuk
Buat kelas `Cat` yang memperluas `Animal`. Deklarasikan konstruktor `public Cat(String name) { super(name); }` dan ganti metode `makeSound()` menggunakan `@Override` untuk mengembalikan `'Meow'`.
Solusi tersedia setelah 3 upaya