문제

Java에는 세 가지 수준의 액세스가 있습니다.

  • 공개 - 세계에 개방
  • 개인 - 수업에만 열립니다
  • 보호 - 클래스 및 하위 클래스 (상속)에만 열립니다.

그렇다면 왜 Java 컴파일러가이를 허용합니까?

testblah.java :

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}

blah.java :

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

bloo.java :

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
도움이 되었습니까?

해결책

실제로 : 그것은 다음과 같아야합니다.

만에만 열립니다 동일한 패키지의 클래스 클래스 및 하위 클래스 (상속)

그것이 이유입니다

다른 팁

보호 된 것은 서브 클래스를 의미하기 때문입니다 또는 같은 패키지의 다른 클래스.

수정자가 생략 될 때 실제로 네 번째 "기본"액세스 수준이 있으며 동일한 패키지의 다른 클래스에 대한 액세스를 제공합니다.

그래서 protected 기본값과 public 입장.

더 구체적으로, 당신은 기대하고 있습니다 protected C ++에서와 같이 작동합니다.

그러나 Java에서는 다른 의미가 있습니다. Java에서는 보호 된 방법이 클래스 (명백히)에 제공되며 동일한 패키지의 다른 모든 클래스 와이 클래스의 하위 클래스를 사용할 수 있습니다. 다른 패키지의 클래스는이 원래 클래스를 서브 클래스하지 않으면 액세스 할 수 없습니다.

이 비슷한 질문을 참조하십시오 상속 마커에 대한보다 구체적인 정보.

개인적으로, 나는 거의 사용하지 않습니다 protected. 프레임 워크보다는 응용 프로그램을 개발하므로 정의 할 가능성이 훨씬 높습니다. public 행동 양식, private 데이터와 꽤 자주 내 전체 수업을 다음과 같이 표시합니다. final.

실제로 "공개", "보호", "개인"및 기본적으로 패키지 개인 또는 패키지 보호라고도하는 4 가지 수준의 액세스가 있습니다. 기본값은 패키지에 대한 접근성을 제한합니다. 기본값은 매우 유용하며 자주 사용합니다.

당신은 전화 할 수 있습니다 b.getMessage() 왜냐하면 b 유형입니다 Bloo, 확장됩니다 Blah, 그리고 getMessage() 보호됩니다. 당신이 언급했듯이, 서브 클래스가 메소드에 액세스 할 수 있도록 보호.

그러나 다음 오류가 있습니다.

  • 부름 super() 논쟁이 없습니다 Bloo 생성자는 오류입니다. 컴파일러는 파라미터를 찾을 수 없습니다 Blah String 매개 변수로 하나를 정의했기 때문에 생성자.
  • 부름 new Blah() 안에 TestBlah main 메소드는 위와 같은 이유에 대한 오류입니다.
  • 참조 a.testing 그리고 b.testing 변수를 정의하지 않았기 때문에 오류입니다 testing 모든 수업에 대해.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top