1. Tapi itu belum semuanya.

Misalkan Cowkelas memiliki printAll()metode yang memanggil dua metode lainnya. Maka kode akan bekerja seperti ini:

Kode Keterangan
class Cow
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor ()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a cow");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
public static void main(String[] args)
{
   Whale whale = new Whale ();
   whale.printAll();
}
Output layar akan menjadi:
I'm a white whale
I'm a whale

Perhatikan bahwa ketika printAll()metode di Cowkelas dipanggil pada Whaleobjek, printNamemetode kelasWhale yang digunakan, bukan yang ada di Cowmetode.

Hal utama bukanlah kelas tempat metode ditulis, melainkan jenis (kelas) objek tempat metode dipanggil.

Hanya metode non-statis yang dapat diwariskan dan diganti. Metode statis tidak diwariskan dan karenanya tidak dapat diganti.

Inilah Whaletampilan kelas setelah menerapkan pewarisan dan penggantian metode:

class Whale
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
Inilah Whaletampilan kelas setelah menerapkan pewarisan dan penggantian metode: Kami tidak tahu tentang printNamemetode lama apa pun.

2. Pengetikan

Ada hal yang lebih menarik di sini. Karena kelas mewarisi semua metode dan data dari kelas induknya, referensi ke objek kelas anak dapat disimpan dalam (ditugaskan ke) variabel yang tipenya sama dengan kelas induk (dan induk dari induk, dll. — sampai kelas Object). Contoh:

Kode Keterangan
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
Output layar akan menjadi:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
Output layar akan menjadi:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
Output layar akan menjadi:
Whale@da435a.

Metode ini toString()diwarisi dari Objectkelas

Ini adalah properti yang sangat berharga: beberapa saat kemudian Anda akan memahami cara menggunakannya dalam praktik.


3. Memanggil metode pada suatu objek

Ketika sebuah metode dipanggil pada sebuah variabel, metode tersebut sebenarnya dipanggil pada sebuah objek. Mekanisme ini disebut pengiriman metode dinamis.

Begini tampilannya:

Kode Keterangan
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Output layar akan menjadi:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
Output layar akan menjadi:
I'm a whale

Perhatikan bahwa implementasi spesifik dari printName()metode yang dipanggil — yang ada di Cowatau yang ada di Whalekelas — tidak ditentukan oleh tipe variabel, tetapi oleh tipe objek yang dirujuk oleh variabel tersebut.

Variabel Cowmenyimpan referensi ke Whaleobjek, dan printName()metode yang didefinisikan di Whalekelas adalah apa yang disebut.

Ini tidak terlalu jelas. Ingat aturan utama:

Himpunan metode yang tersedia untuk dipanggil pada variabel ditentukan oleh tipe variabel. Dan implementasi metode spesifik yang dipanggil ditentukan oleh jenis/kelas objek yang dirujuk oleh variabel.

Anda akan menemukan ini sepanjang waktu, jadi semakin cepat Anda mengingatnya, semakin baik.