source

"package private" 멤버액세스는 디폴트(수정자 없음)액세스와 동의어 아닌가요?

manysource 2022. 11. 24. 21:41

"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