code

"패키지 개인"구성원 액세스는 기본 (수정 자 없음) 액세스와 동의어가 아닙니까?

codestyles 2020. 9. 3. 19:15
반응형

"패키지 개인"구성원 액세스는 기본 (수정 자 없음) 액세스와 동의어가 아닙니까?


일부 문서에서 "기본 액세스"사용과 함께 사용하는 "패키지 개인"이라는 용어에 대해 약간 혼란스러워합니다. 패키지 개인 및 기본 액세스는 모두 protected와 동의어가 아닙니까?


예, 거의 동일합니다. protected 수정자는 자신의 패키지 (package-private와 마찬가지로) 내에서만 멤버에 액세스 할 수 있으며 추가 로 다른 패키지에있는 해당 클래스의 하위 클래스에서 액세스 할 수 있도록 지정 합니다.


"기본"액세스 수정 자 (명시 적으로 지정되지 않은 경우)는 "패키지-개인"이며, 이는 동일한 패키지에있는 항목 만 액세스 할 수 있음을 의미합니다. 그러나 동일한 패키지에 있다는 것은 클래스 간의 상속 관계에 대해 전혀 의미하지 않습니다. 순전히 명명 규칙입니다.

"보호됨"은 동일한 패키지에있는 클래스뿐만 아니라 하위 클래스 (해당 하위 클래스가있는 패키지에 관계없이)도 액세스 할 수 있음을 의미합니다.


클래스 의 기본 액세스 는 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 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*/그러한 상황에 (코멘트로) 넣기위한 단명 한 유행이 있었다 . 마찬가지로 그 당시에는 동기화 된 클래스와 같은 것을 선언 할 수 있었지만 실제 의미 효과는 없었습니다.

둘 다 다른 패키지의 파생 클래스로 확장되는 '보호됨'과 동일하지 않습니다.


From Java Language Spec

  • 6.6.5 Example: Default-Access Fields, Methods, and Constructors If none of the access modifiers public, protected, or private are specified, a class member or constructor is accessible throughout the package that contains the declaration of the class in which the class member is declared, but the class member or constructor is not accessible in any other package.

If a public class has a method or constructor with default access, then this method or constructor is not accessible to or inherited by a subclass declared outside this package


default and package-private both are same, which means both can be used by any class till they are in same package.

The package-private term, actually, is termed by the meaning of private modifier as private means it is available only in same class and no other classes or subclasses can access it within same package or without.

Hence package-private means same as default.

참고URL : https://stackoverflow.com/questions/5416074/isnt-package-private-member-access-synonymous-with-the-default-no-modifier

반응형