"package private" 멤버액세스는 디폴트(수정자 없음)액세스와 동의어 아닌가요?
일부 설명서에서 사용하는 "package private"라는 용어와 "default access"라는 용어에 대해 조금 혼란스럽습니다.package-private 액세스와 default 액세스는 모두 protected와 동의어 아닌가요?
네, 거의 비슷해요.보호된 수식자는 멤버에게 (package-private와 마찬가지로) 자신의 패키지 내에서만 액세스 할 수 있으며, 또한 다른 패키지에 있는 클래스의 서브클래스에 의해서도 액세스 할 수 있도록 지정합니다.
디폴트 액세스 수식자(모두 명시적으로 지정되어 있지 않음)는 「package-private」입니다.이것은, 같은 패키지내의 물건만이 액세스 할 수 있는 것을 의미합니다.그러나 동일한 패키지에 있는 것은 클래스 간의 상속 관계에 대해 아무런 의미도 없으며 이름 지정 규칙일 뿐입니다.
"Protected"는 동일한 패키지의 클래스뿐만 아니라 하위 클래스(이러한 하위 클래스가 속한 패키지에 관계없이)도 액세스할 수 있음을 의미합니다.
클래스의 기본 액세스는 package-private이지만 인터페이스 멤버의 기본 액세스는 public입니다.
예.
public interface I {
int A = 1;
// same as
public static final int A = 1;
void method();
// same as
public abstract void method();
class C { }
// same as
public static class C { }
}
인터페이스의 디폴트액세스 규칙은, 클래스의 액세스 규칙과 다릅니다.
package-private 및 default access는 동의어입니다.개체는 클래스가 동일한 패키지에 있는 개체의 보호된 구성원에 액세스할 수도 있습니다.오브젝트는 패키지에 대한 조건 없이 슈퍼클래스의 보호된 멤버에 액세스할 수도 있습니다.구체적인 예로는 다음과 같습니다.
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
}
'Package private'와 기본 액세스는 동일합니다.1.1.2/3에 가까운 컴파일러의 초기 릴리스에서는 'package'는 허용되는 수식자였지만 무시되었습니다.즉, 수식자가 없는 것과 같은 의미입니다.즉, 'package private'입니다.얼마 지나지 않아 퍼팅을 위한 짧은 패션이 생겼다./*package*/
(코멘트로서) 그러한 상황에서.마찬가지로 동기화된 클래스 같은 것을 선언할 수 있지만, 실제 의미 효과는 없습니다.
둘 다 다른 패키지의 파생 클래스로 확장되는 'protected'와 같지 않습니다.
Java 언어 사양에서
- 6.6.5 예: 기본 액세스 필드, 메서드 및 생성자 퍼블릭, 보호됨 또는 개인 액세스 수식자가 지정되지 않은 경우 클래스 멤버가 선언된 클래스의 선언을 포함하는 패키지 전체에서 클래스 멤버 또는 생성자에 액세스할 수 있지만 클래스 멤버 또는 생성자는 다른 패키지에서는 액세스할 수 없습니다..
공용 클래스에 기본 액세스 권한을 가진 메서드 또는 생성자가 있는 경우 이 메서드 또는 생성자는 이 패키지 외부에 선언된 하위 클래스에 액세스할 수 없거나 상속되지 않습니다.
default와 package-private는 모두 동일합니다.즉, 둘 다 같은 패키지에 포함될 때까지 임의의 클래스에서 사용할 수 있습니다.
package-private 용어는 실제로는 private 수식자의 의미에 의해 정의됩니다.private는 같은 클래스에서만 사용할 수 있으며 같은 패키지 내에서 또는 없이 다른 클래스나 서브클래스가 접근할 수 없습니다.
따라서 package-private는 기본값과 동일합니다.
언급URL : https://stackoverflow.com/questions/5416074/isnt-package-private-member-access-synonymous-with-the-default-no-modifier
'source' 카테고리의 다른 글
python의 현재 시간에 시간을 추가하는 방법 (0) | 2022.11.24 |
---|---|
jQuery를 사용하여 목록을 알파벳 순으로 정렬하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
마리아에 대한 XAMPP 루트 사용자 암호 설정DB (0) | 2022.11.24 |
리스트에서 플랫리스트를 작성하려면 어떻게 해야 하나요? (0) | 2022.11.23 |
왜 Python의 '프라이빗' 메서드는 실제로 비공개 방식이 아닐까요? (0) | 2022.11.23 |