2017-12-12 15 views
1

'a.eat()'아래의 코드는 컴파일 오류가 발생하거나 선언되어야합니다.예외 컴파일러 오류가있는 메서드 재정의

class Animal { 
    public void eat() throws Exception {} 
} 

class Dog extends Animal { 
public void eat() {} 

public static void main(String [] args) { 
    Animal a = new Dog(); 
    Dog d = new Dog(); 
    d.eat(); 
    a.eat();//Causes compilation error as 'a' was not declared or caught 
    } 
}    

컴파일러가 여전히 예외를 선언하는 메서드를 호출한다고 생각하는 이유는 무엇입니까? 컴파일러가 'd.eat()'에서와 같이 하위 형식에 의해 메서드가 재정의 된 것을 보는 이유는 무엇입니까?

+2

'a'는 '동물'이기 때문에. – tkausl

+2

일반적으로 볼 수 없습니다. 그리고 그것은 일관성이 있어야합니다. –

답변

1

컴파일러는 aAnimal임을 알고 있습니다. 이 a.eat(); 전에 다음

class HairballException extends Exception {} 

class Cat extends Animal { 
    public void eat() throws HairballException {} 
} 

및이 완벽하게 합법적 때문이다 :

a = new Cat(); 

변수 aAnimal입니다 어떤 클래스가 될 수 있습니다. 컴파일러는 a이 여전히 Dog이라고 가정 할 수 없으므로 Exception을 던질 수 있도록 시행해야합니다.

당신이 정말로 Animal의이 eat() 방법을 던질 수있는 Exception 잡으려고하지 않으려면

eat()를 호출하기 전에 Doga를 캐스팅.

0

'a'로 참조되는 실제 개체가 Dog 유형인데도 변수 'a'의 클래스는 클래스 Animal입니다.

따라서 컴파일러는 Animal eat() 메서드가 선언하므로 a.eat()가 예외를 throw 할 수 있으므로이 호출이 try catch에 래핑되거나 메서드 호출자가 throw 절.