Polymorphism: dynamic dispatch and toString() · Polimorfisme: penyaluran dinamis dan toString()
Polymorphism: one type, many behaviours
- Polymorphism means "many forms": one superclass type, many subclass behaviours.
- You can hold a
Dogor aCatin anAnimalvariable, because each is-anAnimal. - When you call a method, the object's real type decides which version runs.
Polimorfisme: satu tipe, banyak perilaku
- Polimorfisme berarti "banyak bentuk": satu tipe superclass, banyak perilaku subclass.
- Anda bisa menyimpan
DogatauCatdalam variabelAnimal, karena masing-masing merupakanAnimal. - Saat Anda memanggil method, tipe asli objek menentukan versi mana yang dijalankan.
Dynamic dispatch
- The variable's type (
Animal) decides which methods you are allowed to call. - But at run time, the actual object (
Dog) decides which overridden version runs. - This run-time choice is called dynamic dispatch — it is the heart of polymorphism.
Penyaluran dinamis
- Tipe variabel (
Animal) menentukan metode mana yang diizinkan untuk Anda panggil. - Namun pada saat runtime, objek aktual (
Dog) yang menentukan versi yang di-override mana yang berjalan. - Pilihan waktu runtime ini disebut dynamic dispatch — ini adalah inti dari polimorfisme.
public class Main {
public static void main(String[] args) {
Animal[] zoo = { new Dog(), new Cat(), new Dog() };
for (Animal a : zoo) {
System.out.println(a.speak()); // Woof, then Meow, then Woof
}
}
}
class Animal {
public String speak() { return "some sound"; }
}
class Dog extends Animal {
public String speak() { return "Woof"; }
}
class Cat extends Animal {
public String speak() { return "Meow"; }
}
One loop handles every subclass
- The loop above never asks "is this a Dog or a Cat?" — it just calls
speak(). - Each object answers in its own way. That keeps the loop short and general.
- Add a brand-new subclass later and the same loop works on it, unchanged.
Satu perulangan menangani setiap subclass
- Loop di atas tidak pernah bertanya "apakah ini Anjing atau Kucing?" — ia hanya memanggil
speak(). - Setiap objek menjawab dengan caranya sendiri. Hal itu menjaga perulangan tetap singkat dan umum.
- Tambahkan subclass baru nanti dan perulangan yang sama tetap bekerja padanya, tanpa perubahan.
toString(): every object inherits it from Object
- Every class in Java secretly extends a class called
Object, which has atoString(). - Override
toString()to say how your object should look as text. - Java calls it automatically when you print an object or join it with
+.
toString(): setiap objek mewarisinya dari Object
- Setiap kelas di Java secara diam-diam memperluas (extends) sebuah kelas bernama
Object, yang memilikitoString(). - Alihkan
toString()untuk menyatakan bagaimana objek Anda harus terlihat sebagai teks. - Java memanggilnya otomatis ketika Anda mencetak sebuah objek atau menggabungkannya dengan
+.
public class Main {
public static void main(String[] args) {
Object x = new Fraction(3, 4);
System.out.println(x); // 3/4 -- toString() runs
System.out.println("ratio " + x); // ratio 3/4
}
}
class Fraction {
private int numerator;
private int denominator;
public Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public String toString() {
return numerator + "/" + denominator;
}
}
Common mistakes
- The actual object's method runs at run time (dynamic dispatch), not the variable's type.
- Override
toString()for readable output.
Kesalahan umum
- Metode objek aktual berjalan pada saat runtime (dynamic dispatch), bukan berdasarkan tipe variabel.
- Override
toString()untuk output yang dapat dibaca.
Now you try
- Use a superclass array, add a new subclass, and override
toString(). - A hidden Harness checks that the right version runs for each object.
- Press Run to compile, then Check answer. Your code runs on the server, so even the first run is fast.
Sekarang Anda coba
- Gunakan array superclass, tambahkan subclass baru, dan override
toString(). - Harness tersembunyi memeriksa bahwa versi yang tepat dijalankan untuk setiap objek.
- Tekan Run untuk kompilasi, lalu Check answer. Kode Anda berjalan di server, sehingga bahkan run pertama pun cepat.
Animal, Dog, and Cat are written for you. Complete the static method Zoo.chorus(Animal[] animals) so it returns every animal's sound joined by single spaces. Example: a Dog, Cat, Dog array gives "Woof Meow Woof". An empty array gives "". Loop and call speak() — let polymorphism pick the right sound. · Animal, Dog, dan Cat sudah ditulis untuk Anda. Lengkapi method statis Zoo.chorus(Animal[] animals) agar mengembalikan suara setiap hewan yang digabungkan dengan spasi tunggal. Contoh: array Dog, Cat, Dog menghasilkan "Woof Meow Woof". Array kosong menghasilkan "". Lakukan loop dan panggil speak() — biarkan polimorfisme memilih suara yang tepat.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.
Animal, Dog, Cat, and a working Zoo.chorus are written for you. Add a class Cow that extends Animal and overrides speak() to return "Moo". Notice the existing chorus loop handles your new Cow with no changes. · Animal, Dog, Cat, dan Zoo.chorus yang berfungsi sudah ditulis untuk Anda. Tambahkan class Cow yang extends Animal dan override speak() untuk mengembalikan "Moo". Perhatikan bahwa loop chorus yang sudah ada menangani Cow baru Anda dengan tanpa perubahan.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.
Complete Fraction by overriding toString() so it returns the fraction as "numerator/denominator" — for 3 and 4 it returns "3/4". Java calls toString() automatically when you print a Fraction or join it with +. · Lengkapi Fraction dengan override toString() agar mengembalikan pecahan sebagai "numerator/denominator" — untuk 3 dan 4 ia mengembalikan "3/4". Java memanggil toString() secara otomatis saat Anda mencetak Fraction atau menggabungkannya dengan +.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.