2009-08-30 7 views
1
public class A 
{ } 

public class B extends A 
{ 
    public void add() 
    { 
    System.out.println("add in B"); 
    } 
} 

여기에 다음과 같은 방법으로 추가를 호출하면 오류가 발생합니다. A a1 = new B; a1.add();자식 클래스의 개체를 참조하는 부모 클래스 참조를 사용하여 Parent 클래스의 자식 메서드를 호출해야하는 이유는 무엇입니까?

하지만 클래스 A에 add() 메소드를 추가 한 다음 비슷한 방식으로 호출하면 add() 메소드가 호출됩니다.

public class A 
{ 
    public void add() 
    { 
    System.out.println("add in A"); 
    } 
} 

public class B extends A 
{ 
    public void add() 
    { 
    System.out.println("add in B"); 
    } 
} 

호 :

A a1 = new B; 
a1.add(); 

출력 왜 그렇게

add in B

입니까?

+0

이것은 다형성 –

답변

1

java는 컴파일 타임에 a1이 런타임에 B의 인스턴스를 참조하기 때문에 알 수 없습니다. 선언 된 유형 만 알고 있으므로 선언 된 유형과 작동하는 호출 만 허용합니다.

2

a1.add() 메소드 호출시 컴파일러는 메소드가 있는지 검사합니다. 그러나 그것은 오직 a1이 그 방법을 가지고 있지 않은 A 클래스의 객체에 대한 참조임을 알고 있습니다. 따라서 컴파일이 실패합니다.

이 간단한 예제에서는 컴파일러가 올바른 유형을 쉽게 공제 할 수 있습니다. 그러나보다 일반적인 경우에는 그렇게하지 않을 것입니다. 따라서 이러한 종류의 논리는 사양의 일부가 아닙니다.

+0

의 경우입니다. 그리고 실제로 메소드를 호출 할 때 JVM은 런타임에 정확한 메소드가 변수에 저장된 값의 런타임 유형에 따라 호출되도록합니다. 귀하의 경우 변수 a1의 실제 값은 B이므로 클래스 B에 선언 된 메소드 추가가 호출됩니다. – Nikem

0

Java 컴파일러가 참조 a1을 보면 사용할 수있는 방법을 알고 있습니다. 첫 번째 예에서 클래스 A의 API에는 add()이 없습니다. 이 경우에 a1 ~ B의 캐스트를 다음과 같이 수행하는 것이 합법적입니다.

((B) a1) .add();

및 컴파일러에서 불평하지 않습니다.

0

선언 된 유형 A의 객체에서 메소드를 호출하지만 A의 하위 클래스 B에서만 구현하려고합니다. 이 경우 일반적으로 A를 abstract class으로 만들고 A에서 추상 메소드를 선언합니다.

0

좋은 답변 ... 나는 이것에 관해서도 의심의 여지가 있었지만 지금은 분명하다. 그리고 한 가지 더 .. 추상적 인 방법을 선언하는 문제에 빠져들 필요가 없다. 단지 비어있게 만든다. 메서드를 부모 클래스의 동일한 이름과 서명으로 사용하고 "voila"는 모든 컴파일 오류가 없어졌습니다.)

이 경우 void add() {} 메서드를 추가하면 h ave any problems

관련 문제