2014-04-17 1 views
1

그래서 한 친구가이 코드를 보내고 성공적으로 컴파일하고 42를 반환했다고 말했습니다. 하지만 부모 클래스의 메소드는 귀찮은 문제입니다. "return"은 private이고, 호출 된 메소드는 자식 클래스에 있으며 public입니다. 그럼, 왜 누군가가 어떻게 작동하는지 말할 수 있습니까?java, 상속 - 부모의 비공개 필드가 자식의 public 메서드를 통해 액세스 됨

static class A { 
    private int f() { 
     return 42; 
    } 
} 

static class B extends A { 
    public int f2() { 
     return super.f(); 
    } 
} 

public static void main(String[] args) { 
    System.out.print(new B().f2()); 

} 

내가 정적을 제거하려고 42

반환하고,

class A { 
    private int f() { 
     return 42; 
    } 
} 

class B extends A { 
    public int f2() { 
     return super.f(); 
    } 
} 

public static void main(String[] args) { 
    Main m= new Main(); 
    B b= m.new B(); 
    System.out.print(b.f2()); 

} 

는 여전히 클래스 (AB) 모두 이후 42

답변

6

을 반환 Main에 중첩되어 있으면 private int f() 메서드에 액세스 할 수 있습니다.

최상위 클래스에 AB의 출처를 추출하면 이러한 일이 발생하지 않으므로 컴파일되지 않습니다.

0

개인적인 관점은 "외부"클래스가 개인 변수를 볼 수 없어야한다는 것입니다. 그러나 A와 B는 모두 같은 클래스의 일부이거나 서로 중첩되어있어 서로 사적인 멤버에 액세스 할 수 있습니다.

public class A { 

    private void a() { 
    int bVal = this.new B().val; //! Accessing B private 
    } 

    class B { 
     A a = new A(); 
     private int val = 10; 
     public void b() { 
     a.a();  // !! Accessing A private 
     } 
} 

을하지만,이 A와 B가 동일한 파일에 있지만 서로 내에있는 경우에도 실패합니다 :

그래서이 작동합니다

class A { 
    private void a() {} 
} 

class B extends A { 
    A a = new A(); 
    public void b() { 
     a.a(); // can't see even if B extends A 
    } 
} 
0

이가 왜냐하면 두 클래스 A와 B는 다른 클래스 내부에 중첩되어 있기 때문입니다. 즉, 두 클래스 모두 다른 같은 클래스의 내부 클래스 (또는 "일부분")입니다. 그것들 (데이터 멤버와 메서드)은 기본적으로 외부 클래스의 멤버이기 때문에 private 인 경우에도 다른 내부 클래스에서 액세스 할 수 있습니다.
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

class Outer{ 


class A { 
    private int f() { 
     return 42; 
    }//Method f() is a private member of A and accessible by Outer 
} 

class B extends A { 
    public int f2() { 
     return super.f(); 
    }//As class B is inner class of Outer it can access members of outer,thus indirectly member of A 
} 

public static void main(String[] args) { 
    System.out.print(new B().f2()); 

} 

} 
: 중첩 클래스를 먼저 읽기에 대해 당신이 모르는 경우

자바 클래스의 우리에게 중첩 할 수 있습니다