1. Tetapi bukan itu sahaja.

Katakan Cowkelas mempunyai printAll()kaedah yang memanggil dua kaedah lain. Kemudian kod akan berfungsi seperti ini:

Kod Penerangan
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 skrin akan menjadi:
I'm a white whale
I'm a whale

Ambil perhatian bahawa apabila printAll()kaedah dalam Cowkelas dipanggil pada Whaleobjek, printNamekaedah kelasWhale digunakan, bukan kaedah dalam Cowkaedah.

Perkara utama bukanlah kelas kaedah ditulis, tetapi jenis (kelas) objek yang kaedah dipanggil.

Hanya kaedah bukan statik boleh diwarisi dan ditindih. Kaedah statik tidak diwarisi dan oleh itu tidak boleh ditindih.

Inilah Whalerupa kelas selepas menggunakan warisan dan kaedah mengatasi:

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");
   }
}
Begini Whalerupa kelas selepas menggunakan warisan dan kaedah mengatasi: Kami tidak tahu tentang sebarang printNamekaedah lama.

2. Typecasting

Terdapat perkara yang lebih menarik di sini. Oleh kerana kelas mewarisi semua kaedah dan data kelas induknya, rujukan kepada objek kelas anak boleh disimpan dalam (ditugaskan kepada) pembolehubah yang jenisnya sama dengan kelas induk (dan induk induk, dsb. — sehingga ke Objectkelas). Contoh:

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

Kaedah ini toString()diwarisi daripada Objectkelas

Ini adalah harta yang sangat berharga: sedikit kemudian anda akan memahami cara menggunakannya dalam amalan.


3. Memanggil kaedah pada objek

Apabila kaedah dipanggil pada pembolehubah, kaedah itu sebenarnya dipanggil pada objek. Mekanisme ini dipanggil penghantaran kaedah dinamik.

Begini rupanya:

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

Ambil perhatian bahawa pelaksanaan khusus kaedah printName()yang dipanggil — yang dalam Cowatau yang dalam Whalekelas — tidak ditentukan oleh jenis pembolehubah, tetapi oleh jenis objek yang dirujuk oleh pembolehubah itu.

Pembolehubah Cowmenyimpan rujukan kepada Whaleobjek, dan printName()kaedah yang ditakrifkan dalam Whalekelas ialah apa yang dipanggil.

Ini tidak begitu jelas. Ingat peraturan utama:

Set kaedah yang tersedia untuk dipanggil pada pembolehubah ditentukan oleh jenis pembolehubah. Dan pelaksanaan kaedah khusus yang dipanggil ditentukan oleh jenis/kelas objek yang dirujuk oleh pembolehubah.

Anda akan menghadapi ini sepanjang masa, jadi lebih cepat anda mengingati ini, lebih baik.