2012-11-12 1 views
4

질문을 설명하는 코드 스 니펫을 찾으십시오. 인터페이스가 객체 계층 구조의 일부입니까?

public class Test { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    I ref = new B(); 
    ref.equals(""); 
} 

} 

interface I{ 

} 

class A { 
public void method(){ 

} 
} 

class B extends A implements I{ 

} 

main()에, ref.equals()이 허용 되나 ref.method()이 허용되지 않습니다를 참조하십시오. 왜 그렇습니까?

EDIT : 개체는 B (또는 A 또는 다른 클래스)의 수퍼 클래스이지만 A와 마찬가지로 B도 수퍼 클래스입니다. 제 질문은 A의 'method()'가 'ref'에 표시됩니다. 즉, ref.equals()가 허용되지만 ref.method()가 아닌 이유는 무엇입니까? 이 메소드 가시성 검사가 어떻게 수행됩니까? JVM에 뿌리를 내리고 있습니까? 당신은 내가 and the methods from Object에 선언 된 메소드를 볼 수

I ref = new B(); 

: 당신이 I로 선언 않았기 때문이다

답변

7

.

당신이 할 때

A ref = new B(); 

또는 B로

B ref = new B(); 

를 선언 또는 A

I ref = new B(); 
((A)ref).method() 

당신이 의지에 캐스트 :

는로 선언 액세스 권한 :

ref.method() 

그리고 내가 A와 I의 메소드를보고 싶다면 그 사이에 객체를 캐스팅 할 수 있습니다. 또는 A가 I를 구현하도록하십시오.

1

인터페이스를 사용하여 개체를 참조 할 때

 I ref = new B(); 

는 당신이 인터페이스와 Object 클래스 방법 만의 접근성을 가지고있다. 개체를 클래스에 캐스팅 할 때까지 클래스 메서드에 대한 가시성이 없습니다.

당신은 method는 다음 아래 중 하나를 수행 할 수 A 클래스에서 선언에 액세스하려면 :

I ref = new B(); 
    ((A)ref).method() 

또는

A ref = new B(); 
    ref.method(); 

또는

B ref = new B(); 
    ref.method(); 
0

인터페이스 유형을 기본적으로 하위 클래스 인 구체적인 클래스를 사용하여 인스턴스화 할 수 있습니다. 객체의 ss. 따라서 인터페이스 유형에서 Object의 메소드를 호출 할 수 있습니다. 다른 모든 사용자 정의 메서드는 해당 인터페이스 또는 해당 수퍼 인터페이스에서 선언 된 경우에만 인터페이스 유형에서 호출 할 수 있습니다.

0

인터페이스를 통해 개체를 참조하면 인터페이스가 노출하는 메서드에만 액세스 할 수 있습니다.

0

이 허용됩니다. 왜냐하면 equals()은 객체의 메소드이고 B가 암시 적으로 Object을 확장하기 때문에 모든 하위 클래스에서 사용할 수 있기 때문입니다.

method()가 B에 없으면 진술 문이 I i = new B() 일 때 액세스 할 수 없습니다.

2

Java Language Specification은 java.lang.Object가 수퍼 인터페이스가없는 모든 인터페이스의 직접 상위 유형이라는 것을 명시합니다.