상속과 타입 캐스팅이 혼합되면 약간 혼란 스럽습니다. 상속에서 올바른 메서드와 변수를 선택할 때 Java 컴파일러가 따르는 규칙을 이해하고 싶습니다.자바 컴파일러는 어떻게 상속에서 올바른 메소드와 변수를 선택합니까?
변수와 같은
내가 읽고 뭔가가 컴파일 타임에 바인딩 및 방법은 런타임에 바인딩됩니다.
두번째는 stackoverflow 내지 (@ 존 스키트)
과부하 해상도 (호출되는 메소드 서명) 모두의 컴파일 - 시간 타입에 기초하여, 컴파일 시간에 결정된다 메서드 타겟 및 인수 표현식
해당 메서드 서명 (을 오버라이드)의 구현은 실행시 대상 객체의 실제 유형을 기반으로합니다.
하지만 문제는 특정 상황에 대한 설명이며 예외 처리와 같은 다른 요소를 고려할 때 일반적인 절차를 따르지 않는 것이 문제입니다.
이것은 좋지 않을 수도 있지만 메서드와 변수가 모두 무시됩니다 (static
변수의 경우 숨김).
자바 컴파일러가 컴파일 할 때 어떤 메소드/변수가 호출되어야 하는지를 선택해야한다면 어떤 알고리즘을 따르겠습니까? 마찬가지로 런타임시 Java 컴파일러가 사용할 알고리즘은 무엇입니까 (참조가 사용되는 객체의 실제 유형에 기반)?
예외 처리는 과부하 해결의 일부가 아니지만 (선택한 과부하가 유효하지 않을 수도 있음), 변수가 덮어 쓰여지지 않고 숨겨져 있습니다. 자세한 규칙을 찾고 있다면 JLS를 읽어 보시기 바랍니다. http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12 –
컴파일러는 선택하지 않으며 컴파일 타임에 메소드를 호출하지 않습니다. 가상 메소드 테이블을 사용하여 런타임에이를 수행하는 것은 JVM의 책임입니다. –
"메소드와 변수가 모두 무시된다고 가정하십시오." "변수 무시"와 같은 것은 없습니다. @JonSkeet이 "과부하 해결"이라고 부르는 것은 _signature_ 메서드를 선택하는 것을 의미합니다. 서명은 메소드 이름의 확장 된 형식입니다. foo (int i)로 선언 된 메서드는 foo (String s)로 선언 된 메서드와 다른 서명 (name)을가집니다. 컴파일러는 컴파일 타임에 메소드 호출 표현식의 메소드 서명을 항상 알 수 있습니다. _Overriding_는 부모 클래스와 하위 클래스가 모두 동일한 _ 시그니처가있는 메소드를 선언 할 때 발생합니다. 그것이 런타임에 해결되는 것입니다. –