Java는 액세스가 작동하지 않습니다
-
22-07-2019 - |
문제
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
모든 수업에 대해.