1. แต่นั่นไม่ใช่ทั้งหมด

สมมติว่าCowคลาสมีprintAll()เมธอดที่เรียกใช้เมธอดอื่นอีกสองเมธอด จากนั้นรหัสจะทำงานดังนี้:

รหัส คำอธิบาย
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();
}
เอาต์พุตหน้าจอจะเป็น:
I'm a white whale
I'm a whale

โปรดทราบว่าเมื่อมีการเรียกprintAll()เมธอดใน คลาส บนอ็อบเจกต์ เมธอดของคลาสจะถูกใช้ ไม่ใช่เมธอดในเมธอดCowWhaleprintNameWhaleCow

สิ่งสำคัญไม่ใช่คลาสที่เขียนเมธอด แต่เป็นประเภท (คลาส) ของอ็อบเจ็กต์ที่เรียกใช้เมธอด

เฉพาะเมธอดที่ไม่ใช่สแตติกเท่านั้นที่สามารถสืบทอดและแทนที่ได้ เมธอดสแตติกไม่ได้รับการสืบทอด ดังนั้นจึงไม่สามารถแทนที่ได้

นี่คือWhaleลักษณะของคลาสหลังจากใช้การสืบทอดและวิธีการแทนที่:

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");
   }
}
นี่คือWhaleลักษณะของคลาสหลังจากใช้การสืบทอดและการแทนที่เมธอด: เราไม่รู้เกี่ยวกับprintNameเมธอด เก่าใดๆ

2. การพิมพ์

มีจุดที่น่าสนใจยิ่งกว่าที่นี่ เนื่องจากคลาสสืบทอดเมธอดและข้อมูลทั้งหมดของคลาสพาเรนต์ การอ้างอิงถึงออบเจกต์ของคลาสลูกสามารถเก็บไว้ใน (กำหนดให้กับ) ตัวแปรที่มีประเภทเดียวกับคลาสพาเรนต์ (และพาเรนต์ของพาเรนต์ เป็นต้น — ตลอดจนถึงObjectชั้นเรียน) ตัวอย่าง:

รหัส คำอธิบาย
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
เอาต์พุตหน้าจอจะเป็น:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
เอาต์พุตหน้าจอจะเป็น:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
เอาต์พุตหน้าจอจะเป็น:
Whale@da435a.

วิธีการ นี้toString()สืบทอดมาจากObjectคลาส

นี่เป็นทรัพย์สินที่มีค่ามาก หลังจากนั้นไม่นาน คุณจะเข้าใจวิธีใช้มันในทางปฏิบัติ


3. การเรียกใช้เมธอดบนวัตถุ

เมื่อมีการเรียกใช้เมธอดบนตัวแปร วิธีการนั้นจะถูกเรียกใช้บนออบเจกต์ กลไกนี้เรียกว่าการส่งเมธอดแบบไดนามิก

นี่คือลักษณะ:

รหัส คำอธิบาย
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
เอาต์พุตหน้าจอจะเป็น:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
เอาต์พุตหน้าจอจะเป็น:
I'm a whale

โปรดทราบว่าการใช้งานเฉพาะของprintName()เมธอดที่ได้รับการเรียก — หนึ่งในCowหรือหนึ่งในWhaleคลาส — ไม่ได้ถูกกำหนดโดยประเภทของตัวแปร แต่โดยประเภทของวัตถุที่ตัวแปรอ้างถึง

ตัวแปรCowเก็บการอ้างอิงถึงWhaleวัตถุ และprintName()เมธอดที่กำหนดในWhaleคลาสคือสิ่งที่เรียกว่า

นี้ไม่ชัดเจนมาก จำกฎหลัก:

ชุดของเมธอดที่เรียกใช้ตัวแปรได้นั้นถูกกำหนดโดยประเภทของตัวแปร และการใช้งานเมธอดเฉพาะที่ได้รับการเรียกนั้นถูกกำหนดโดยประเภท/คลาสของออบเจกต์ที่อ้างถึงโดยตัวแปร

คุณจะพบสิ่งนี้ตลอดเวลา ดังนั้นยิ่งคุณจำสิ่งนี้ได้เร็วเท่าไหร่ก็ยิ่งดีเท่านั้น