2009-08-28 3 views
12

이 코드에 대해 두 가지 질문이 있습니다."개인 메서드 재정의"혼동

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1) 함수 f가 Override po의 참조에서 어떻게 볼 수 있습니까?

2) 왜 "개인 f()"출력

+0

그러나 하위 클래스의 개체를 사용한 참조가 수퍼 클래스의 개인 메서드를 호출 할 수있는 방법 ??? 이게 버그 야? –

+0

아니요, 이것은 버그가 아니며 올바르게 작동해야합니다. – Jesper

+0

하지만 이것은 상속 및 후기 바인딩 규칙을 위반하지 않습니다 –

답변

24
  1. main있어서, 클래스 Override 내부이다.

  2. 당신은 클래스 Derived에서 하지 오버라이드 (override) 방법 f 있으며, 더 다형성이 없습니다. 변수 po의 유형은 Override이므로 Override 클래스의 메소드 f이됩니다. 클래스 Override의 방법 f은 모든 클래스 Derived에 보이지 않는 것을

참고. Derived 클래스의 f 메소드는 다른 메소드이며, 수퍼 클래스의 f 메소드와 아무런 관련이 없습니다. 당신은 객체가 범위 규칙에 따라, 클래스의 private 멤버가 먼저 고려되기 때문에 파생, 그 그것이 민간 F를 참조하고 재정의 범위에 작성된 경우에도 재정의 자신의 방법을 액세스하는

+0

하지만 바인딩이 런타임에 완료되면 po는 파생 클래스의 객체를 갖게되므로 어떻게 슈퍼 클래스의 private 메소드를 호출 할 수 있습니다. –

+3

코드에서 아무 것도 슈퍼 클래스의 private 메소드에 대한 호출이 있습니다. po.f()를 호출하면 po의 컴파일 타임 유형이 Override이기 때문에 Override가 호출됩니다. 재정의가 없으므로 동적 바인딩 (다형성 없음)이 없습니다. Java는 런타임에 유형을 조사하지 않습니다. – Jesper

2
Override po = new Derived(); 
po.f(); 

하고, private 클래스는 파생 클래스에서 오버라이드되지 않으므로 메소드 서명이 동일한 경우에만 재정의합니다.

Derived po = new Derived(); 
po.f(); 

Thsi는의 유래를 호출 할 올바른 코드 f를

+0

질문은 자바에 관한 것이지 C#에 관한 것이 아닙니다. '가상'은 Java에 존재하지 않습니다. – Jesper

+0

의견을 보내 주셔서 감사합니다. –

0

메소드의 재정의 세 가지 conditions.child 클래스 필수가 슈퍼 class.But과 동일한 이름과 매개 변수와 반환 값을 가지고 있습니다 모두의 경우 ! 재정이 존재하지되도록 매개 변수와 반환 값은 두 가지 방법은 다른 방법을 경우에도 차이가 있습니다 확인과 같은 :!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

이클립스 오류를 이야기하지 않습니다! Child 클래스의 addV 메소드가 Parent 클래스의 addV 메소드와 다르기 때문에.

+0

메소드의 이름과 args 목록 만 정확히 같아야합니다. 자식의 반환 값은 부모의 반환 값의 하위 클래스가 될 수 있습니다. 그리고 생략 한 규칙이 두 가지 더 있습니다. 아이의 메소드는 적어도 부모 클래스의 메소드만큼 액세스 가능해야합니다. 그리고 하위 클래스는 새로운 검사 된 예외 또는 더 광범위한 예외를 throw 할 수 없습니다. – pkkoniec

관련 문제