Mengapa Tidak Ada Pewarisan Multi-Kelas
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 26 dari 87.
Java sengaja mencegah sebuah class memperluas lebih dari satu class. Pembatasan ini ada karena masalah yang dikenal sebagai Diamond Problem.
Bayangkan jika Java mengizinkan pewarisan berganda. Pertimbangkan skenario hipotetis ini:
// Kode ini TIDAK valid dalam Java
public class A {
public void greet() {
System.out.println("Hello from A");
}
}
public class B extends A {
@Override
public void greet() {
System.out.println("Hello from B");
}
}
public class C extends A {
@Override
public void greet() {
System.out.println("Hello from C");
}
}
// TIDAK diizinkan dalam Java!
public class D extends B, C { }Jika kamu memanggil greet() pada object D, versi mana yang seharusnya dijalankan? Versi dari B atau C? Ambiguitas ini disebut Masalah Berlian, dinamai berdasarkan bentuk berlian yang terbentuk oleh diagram pewarisan.
Solusi Java sederhana: izinkan hanya pewarisan tunggal untuk class. Namun, Java menyediakan alternatif. Sebuah class dapat mengimplementasikan beberapa interface, yang akan kamu pelajari di bab mendatang.
Interface mengatasi masalah diamond dengan cara berbeda dan memberimu fleksibilitas tanpa ambiguitas.
// Ini MEMANG valid di Java
public class Dog extends Animal implements Runnable, Comparable<Dog> {
// Bisa mengimplementasikan beberapa interface
}Pilihan desain ini menjaga model pewarisan Java tetap bersih dan mudah diprediksi, sekaligus memungkinkan penggunaan ulang kode yang efektif melalui interface.
Tantangan
MudahMari kita bangun sistem pemutar musik yang menunjukkan aturan pewarisan tunggal Java dan memperlihatkan bagaimana kamu tetap bisa membuat desain yang fleksibel dengan batasan ini.
Bayangkan kamu ingin membuat smart speaker yang menggabungkan fitur pemutar musik dan asisten suara. Karena Java tidak mengizinkan pewarisan dari beberapa class, kamu perlu merancang hierarkimu dengan cermat menggunakan pewarisan tunggal.
Kamu akan membuat empat file untuk mengatur kodemu:
AudioDevice.java: Buat class dasar yang digunakan bersama oleh semua perangkat pemutar audio. Class ini harus memiliki:- Field privat untuk
deviceName(String) - Konstruktor yang menerima nama perangkat
- Method
getDeviceName()yang mengembalikan nama - Method
playSound()yang mencetak:[deviceName]: Playing audio
- Field privat untuk
MusicPlayer.java: Buat class yang mewarisi AudioDevice dan menambahkan fitur khusus musik:- Field privat untuk
currentSong(String) - Konstruktor yang menerima nama perangkat dan menggunakan
super(deviceName) - Method
setSong(String song)yang mengatur lagu saat ini - Override
playSound()agar mencetak:[deviceName]: Now playing - [currentSong]
- Field privat untuk
SmartSpeaker.java: Buat class yang mewarisi MusicPlayer, bukan mewarisi MusicPlayer dan class VoiceAssistant sekaligus, karena itu berarti pewarisan berganda! Smart speaker mengembangkan kemampuan pemutar musik dengan menambahkan fitur suara:- Field privat untuk
assistantName(String) - Konstruktor yang menerima nama perangkat dan nama asisten, menggunakan
super(deviceName) - Method
voiceCommand(String command)yang mencetak:[assistantName]: Processing "[command]" - Method
getFullInfo()yang mencetak:[deviceName] with [assistantName] assistant
- Field privat untuk
Main.java: Tunjukkan rantai pewarisan bertingkatmu. Kamu akan menerima tiga input: nama perangkat (String), nama asisten (String), dan nama lagu (String). Buat SmartSpeaker, atur lagu, lalu panggil method berikut secara berurutan:getFullInfo()playSound()voiceCommand("skip to next")
Kamu akan menerima tiga input: nama perangkat, nama asisten, dan nama lagu.
Perhatikan bagaimana SmartSpeaker mendapatkan kemampuan musik dengan mewarisi MusicPlayer dalam sebuah rantai (AudioDevice -> MusicPlayer -> SmartSpeaker), alih-alih mencoba mewarisi beberapa class yang tidak berkaitan. Inilah cara Java menjaga pewarisan tetap rapi dan tidak ambigu!
Coba sendiri
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String deviceName = scanner.nextLine();
String assistantName = scanner.nextLine();
String songName = scanner.nextLine();
// TODO: Buat SmartSpeaker dengan deviceName dan assistantName
// TODO: Atur lagu menggunakan setSong()
// TODO: Panggil getFullInfo()
// TODO: Panggil playSound()
// TODO: Panggil voiceCommand("skip to next")
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online