2013-10-08 1 views
3

Java에서 "this"는 현재 개체를 나타냅니다. 나는 "이"현재 객체와 같은 타입이라고 가정하지만,이 예를 고려해"this"키워드의 유형?

class A { 
    static void f() { 
     System.out.println("A.f"); 
    } 
    void g() { 
     this.f(); 
    } 
} 
class B extends A { 
    static void f() { 
     System.out.println("B.f"); 
    } 
} 
public class C { 
    public static void main(String[] args) { 
     B test = new B(); 
     h(test); 
    } 
    static void h(B x) { 
     x.g(); 
    } 
} 

결과는 다음과 같습니다

A.f. 

이해가 안 어느 인해 때 XG() x는 유형 B입니다. xg() 호출에서 g는 B에서 찾은 다음 A에서 찾았습니다 (B 서브 클래스 A이기 때문에). g는 A와 B의 인스턴스 메소드 인 f를 호출합니다. 즉, 호출 된 f의 버전은 암시적인 THIS 매개 변수의 유형에 따라 달라집니다. 나는 X가 B 타입이기 때문에 B.f()가 호출 될 것이라고 추측 하겠지만, 그렇지 않다.

정확히 어떤 유형입니까?

답변

3

static 메서드는 상속되지 않습니다. 당신이

static void h(B x) { 
    x.g(); 
} 

를 호출 할 때 당신은 g()

static void f() { 
    System.out.println("A.f"); 
} 

방법

그들이에 호출되는 참조의 정적 유형에 해결 호출 클래스 A에 선언 요구하고있다. 예를 들어 메소드, 다형성 및 지연 바인딩은 실제 메소드를 실행하는 트릭을 수행합니다. 그러나 늦은 바인딩은 static 메서드에는 적용되지 않으므로 A.f()을 호출합니다.

인스턴스 참조에서 static 메서드를 호출 할 수 있으며 선언 된 형식으로 해결됩니다. 권장하지 않습니다.

+1

그래서 여기에 컴파일러 경고가 표시됩니다. – Thilo

+0

나는 혼란스러워. 이 링크 http://stackoverflow.com/a/10292034/2288418에는 모든 액세스 가능한 메소드가 상속된다고 나와 있습니다. 게다가 상속되지 않았다면 컴파일 타임 오류가 발생합니다. (xg()를 호출 할 때 B에서 g를 찾으려고합니까? –

+1

답변에서 말한 것처럼, 하위 클래스는 '정적'메소드를 선언하지 않습니다. 이 경우, 당신의 자식 클래스는 여전히 그것의 부모 클래스와 같은 타입이기 때문에, 당신은 여전히 ​​참조 나 클래스 식별자를 통해'static' 메소드에 접근 할 수 있습니다. –