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()클래스 의 메서드가 객체 에 대해Cow 호출될 때 메서드 의 메서드 가 아닌 클래스의 메서드가 사용된다는 점에 유의하십시오 .WhaleprintNameWhaleCow

중요한 것은 메서드가 작성된 클래스가 아니라 메서드가 호출되는 객체의 유형(클래스)입니다.

비정적 메서드만 상속 및 재정의할 수 있습니다. 정적 메서드는 상속되지 않으므로 재정의할 수 없습니다.

다음은 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호출됩니다.

이것은 그다지 명백하지 않습니다. 기본 규칙을 기억하십시오.

변수에 대해 호출할 수 있는 메서드 집합은 변수 유형에 따라 결정됩니다. 그리고 호출되는 특정 메소드 구현은 변수가 참조하는 객체의 유형/클래스에 의해 결정됩니다.

당신은 이것을 항상 접하게 될 것이므로 이것을 기억하는 것이 빠를수록 좋습니다.