"기본 액세스"의 사용과 함께 일부 문서에서 사용하는 "패키지 개인"이라는 용어에 대해 약간 혼란스러워합니다. 패키지 개인 및 기본 액세스는 모두 protected와 동의어가 아닙니까?
"기본 액세스"의 사용과 함께 일부 문서에서 사용하는 "패키지 개인"이라는 용어에 대해 약간 혼란스러워합니다. 패키지 개인 및 기본 액세스는 모두 protected와 동의어가 아닙니까?
답변:
예, 거의 같습니다. protected 수정자는 자신의 패키지 (package-private와 마찬가지로) 내에서만 멤버에 액세스 할 수 있으며 추가 로 다른 패키지에있는 해당 클래스의 하위 클래스에서 액세스 할 수 있도록 지정 합니다.
public static final
입니다. 메서드의 경우 public abstract
, 열거 형 또는 주석의 경우 public
이고 클래스의 경우public static
"기본"액세스 수정 자 (명시 적으로 제공되지 않는 항목)는 "패키지-개인"이며, 이는 동일한 패키지의 항목 만 액세스 할 수 있음을 의미합니다. 그러나 동일한 패키지에 있다는 것은 클래스 간의 상속 관계에 대해 전혀 의미하지 않습니다. 순전히 명명 규칙입니다.
"보호됨"은 동일한 패키지의 클래스뿐만 아니라 하위 클래스 (해당 하위 클래스가있는 패키지에 관계없이)도 액세스 할 수 있음을 의미합니다.
패키지 개인 및 기본 액세스는 동의어입니다. 개체는 클래스가 동일한 패키지에있는 개체의 보호 된 멤버에도 액세스 할 수 있습니다. 객체는 또한 패키지에 대한 조건없이 수퍼 클래스의 보호 된 멤버에 액세스 할 수 있습니다. 구체적인 예 :
package ab;
class A {
protected void foo() {}
void dd(){}
}
class C {
void aa(){
A a = new A();
a.foo(); //legal
a.dd(); //legal
}
}
package sub;
class D extends A{
void ac(){
foo(); //legal ..
dd(); //illegal.. because dd has default access..
}
class E {
void ee(){
A a = new A();
a.foo(); //illegal
a.dd(); //illegal
}
'패키지 비공개'와 기본 액세스는 동일합니다. 1.1.2 / 3 전후의 컴파일러 초기 릴리스에서 'package'는 허용 된 수정 자 였지만 무시되었습니다. 이는 수정자가없는 것과 동일 함을 의미합니다. 즉 'package private'. 얼마 지나지 않아 퍼팅을위한 단명 한 패션이있었습니다./*package*/
그러한 상황에 (코멘트로) . 마찬가지로 그 당시에는 동기화 된 클래스와 같은 것을 선언 할 수 있었지만 실제 의미 효과는 없었습니다.
둘 다 다른 패키지의 파생 클래스로 확장되는 '보호됨'과 동일하지 않습니다.
에서 Java 언어 사양
- 6.6.5 예 : 기본 액세스 필드, 메서드 및 생성자 public, protected 또는 private 액세스 한정자가 지정되지 않은 경우 클래스가 속한 클래스의 선언을 포함하는 패키지 전체에서 클래스 멤버 또는 생성자에 액세스 할 수 있습니다. 멤버가 선언되었지만 클래스 멤버 또는 생성자는 다른 패키지에서 액세스 할 수 없습니다.
공용 클래스에 기본 액세스 권한이있는 메서드 또는 생성자가있는 경우이 메서드 또는 생성자는이 패키지 외부에서 선언 된 하위 클래스에 액세스하거나 상속 할 수 없습니다.