2011-11-12 1 views
0

기본적으로 여기에 약간의 문제가 있습니다.개체 참조 형식 (Dynamic Binding)에 문제가 있습니까?

나는 슈퍼 클래스와 서브 클래스를 가지고있다. 수퍼 클래스의 메서드를 재정의하는 하위 클래스의 메서드를 실행하는 할당을 수행해야합니다. 이것은 잘 작동합니다. 내가 겪고있는 문제는 "동적 바인딩"입니다. 하위 클래스와 동일한 클래스로 참조 변수 유형을 선언하면 올바르게 작동합니다. 그러나 형식을 수퍼 클래스의 것으로 선언하면 존재하는 하위 클래스의 메서드를 인식하지 못합니다.

다음은 예입니다. 그것은 잘 작동

BabyShip subref = new BabyShip(); 

: 나뿐만 ShippyShip의 참조를 선언하면 내가 배라는 클래스와 BabyShip

라는 선박의 또 다른 서브 클래스가 있습니다. 그러나, 나는로 선언 할 때 :

Ship subref = new BabyShip(); 

나는 선박으로 하위 참조의 유형을 선언하는 경우 컴파일러도 BabyShip의 방법을 인식하지 않습니다 ...하지만 내 책은 명확하게해야한다고 말한다. 왜이 일을하는거야?

정규식에서 컴파일 할 때 기호 오류를 찾을 수 없습니다.

ShipTester.java:8: error: cannot find symbol 
      ship.setMaxPassengers(1); 
       ^
    symbol: method setMaxPassengers(int) 
    location: variable ship of type Ship 
1 error 

답변

2

정말이 책을 읽지 않으시겠습니까? Java 은 이와 같이 동적 바인딩을하지 않습니다.setMaxPassengers인 경우 BabyShip에 선언 된 만 있으면 컴파일러는 정확하게 올바른 작업을 수행합니다. 컴파일 타임 유형의 표현식에 액세스 할 수있는 멤버에만 액세스 할 수 있습니다.이 경우 shipShip 유형이므로 Ship (및 해당 수퍼 클래스) 멤버 만 사용할 수 있습니다.

책의 내용을 정확히 모른 채 문제가 무엇인지 정확하게 알기가 어렵습니다. 정상적인 Java에서 발생하는 동적 바인딩의 유일한 종류는 재정의 것입니다. 을 Ship으로 선언했지만 로 바꾼 경우 BabyShip에있는 경우 실행시에 오버라이드 된 메서드가 호출됩니다.

자바 7에는 동적 바인딩과 관련하여 몇 가지 새로운 기능이 있지만 여기서 말하는 것과 같지 않습니다.

당신이 생각하는 책의 특정 부분을 인용 할 수 있다면 그렇게 해주십시오.

+0

죄송합니다. 당신 말이 맞아요. 그리고 저는 그것이 타입의 클래스에 속하는 메소드 만 실행할 수 있다는 것을 분명히 읽지 않았습니다. 나는 다른 해결 방법을 사용해야 할 것 같아요. – Johnny

+2

@Johnny : 코드가 특정 하위 클래스에서만 작동한다면 변수의 유형이어야합니다. –