2016-06-01 6 views
0

Java : The Complete Reference 책을 사용하여 Java를 배우고 있습니다. 저는 현재 제 9 장에서 패키지로 바로 소개됩니다. 187 페이지에서 ""이라고 말합니다. "요소를 현재 패키지 외부에서 볼 수있게하려면 클래스를 직접 하위 클래스로 분류하는 클래스에만 허용하려면 해당 요소를 보호 된"으로 선언하십시오. 내가 이해할 수있는 것은 패키지에 상주하는 하위 클래스 인 'B'를 말하며 다른 패키지 'A'안에 public으로 정의 된 클래스를 확장하고 'proc'라는 멤버가 있고 proc을 만들려면 현재 패키지 'A'외부에 정의 된 하위 클래스를 포함하여 모든 하위 클래스에서 사용할 수 있으므로 보호 된 것으로 표시해야합니다. 이제 패키지 'B'내에서 정의 된 서브 클래스 내 구현을 살펴 있습니다다른 패키지에 정의 된 서브 클래스에서 클래스의 보호 된 멤버에 액세스 할 수 없습니다.

package subapp; 
import app.*; 

public class Test extends App { 

    public Test() { 
     App app = new App(); 
     System.out.println(app.proc); // error 
    } 
} 

나는 (클래스 파일 모두) 모든 패키지가 올바르게로드 테스트의 "직접"슈퍼 것을 확신의 매개 변수화되지 않은 생성자는 공개적으로 액세스 할 수 있으며 proc은 protected로 표시되며 main() 함수는 문제가 없습니다. 하지만 "proc은/superclass path /에 접근을 보호하고있다"라는 subapp.Test를 실행할 때 런타임 예외가 발생한다.

+0

[여기] (http://stackoverflow.com/a/33627846/276052)는 'protected'액세스 수정 자의 기본 사항을 보여주는 좋은 표입니다. – aioobe

답변

1

이미 앱을 확장하고 있으므로 생성자 내에서 새로운 앱을 만들려하지 않습니다. 변수가 protected 경우 대신에, 이런 식으로 뭔가를하려고합니다.

public Test() { 
    System.out.println(this.proc); 
} 

가 지금 당신을 위해 작동하지 않는 새 App 내에서하고 있습니다되는 이유 생성자를 호출 한 다음 상속을 통해 대신 Appproc 값에 액세스하려고 시도합니다.

값이이를 통해 정확하지 않으면

, 당신은 System.out.println(this.proc); 전에 설정해야 할 수도 있습니다 또는 당신은 proc이 같은하여 App 생성자를 초기화하게 될 경우 값을 인쇄하기 전에 super(); 생성자를 호출 할 수 있습니다

public App() { 
    proc = "test"; 
} 

//..... 

public Test() { 
    super(); 
    System.out.println(this.proc); 
} 
+0

감사합니다. 그런데 내가 코드에서하는 것처럼 보호 된 멤버를 사용할 수없는 이유는 무엇입니까? 나는 여전히 "내부"테스트 (하위 클래스)에 속해 있습니까? –

+0

@Devashish 부모 생성자가 변수'proc'를 초기화하는 경우 생성자 내에서'super();'를 호출 할 수 있습니다. 그렇다면 편집하십시오. 하지만 당신이 지금 가지고있는 코드에서 작동하지 않는 이유는 당신이'Test' (하위 클래스) 안에 있다고하더라도 그것의 접근 수정 자의 외부에있는'App'의 값에 접근하려고하기 때문입니다. 'protected' 값은 서브 클래스에서만 액세스 할 수 있습니다. 따라서'App'을 확장하면 객체의 새로운 인스턴스를 만들지 않고도 모든 protected 및 public 변수/메소드에 직접 액세스 할 수 있습니다. – Orin

+0

감사합니다 ... 분명합니다. 지금 :) –