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


94

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


7
그렇다면 패키지 개인 액세스를 표현하는 키워드가 없습니까? 액세스 수정자를 지정하지 않음으로써 만 암시됩니까?
TurtleToes 2011 년

5
TurtleToes, 맞습니다. Java 8에서는 실제로 default(인터페이스) 메서드 앞에 수정자를 넣을 수 있기 때문에 약간 혼란 스러울 수 있습니다 . 그러나 그것은 액세스 수정자가 아닙니다! 모든 액세스 수정 자와 해당 범위는 이 표 에서 명확하게 시각화 됩니다.
aioobe

1
당신은 또한에서 튜토리얼 테이블 확인 할 수 docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

답변:


136

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


이 여기에 좋은 답변을 많이했다,하지만 난 그것을 받아들이는거야 그래서이 하나, 그것은 간단하고 요점 설명
TurtleToes

23
인터페이스 멤버에 대한 기본 액세스는 패키지 전용 이 아닙니다 .
Peter Lawrey 2011 년

1
@PeterLawrey 오? 그러면 인터페이스 멤버의 기본 액세스는 무엇입니까?
ArtOfWarfare

8
필드의 기본값은 public static final입니다. 메서드의 경우 public abstract, 열거 형 또는 주석의 경우 public이고 클래스의 경우public static
Peter Lawrey

36

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

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


잘 보호에 대한 당신의 표현은 .. 잘못 .. 같은 패키지의 클래스 인스턴스는 보호 된 멤버에 액세스 할 수 있습니다
Gursel Koca

15

클래스 의 기본 액세스 는 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 { }
}

인터페이스에 대한 기본 액세스 규칙은 클래스와 동일하지 않습니다.


3

패키지 개인 및 기본 액세스는 동의어입니다. 개체는 클래스가 동일한 패키지에있는 개체의 보호 된 멤버에도 액세스 할 수 있습니다. 객체는 또한 패키지에 대한 조건없이 수퍼 클래스의 보호 된 멤버에 액세스 할 수 있습니다. 구체적인 예 :

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     
    }

downvoter이 설명의 잘못이 무엇인지 설명 할 수 .. 나쁜 문구를 제외하고는 ..?
Gursel Koca에게

6
나는 반대 투표자가 아니지만 그것이 옳지 않기 때문이라고 생각합니다. 개체는 패키지에 관계없이 보호 된 슈퍼 클래스 멤버에 액세스 할 수 있습니다 .
Adrian Petrescu 2011 년

1

'패키지 비공개'와 기본 액세스는 동일합니다. 1.1.2 / 3 전후의 컴파일러 초기 릴리스에서 'package'는 허용 된 수정 자 였지만 무시되었습니다. 이는 수정자가없는 것과 동일 함을 의미합니다. 즉 'package private'. 얼마 지나지 않아 퍼팅을위한 단명 한 패션이있었습니다./*package*/ 그러한 상황에 (코멘트로) . 마찬가지로 그 당시에는 동기화 된 클래스와 같은 것을 선언 할 수 있었지만 실제 의미 효과는 없었습니다.

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


0

에서 Java 언어 사양

  • 6.6.5 예 : 기본 액세스 필드, 메서드 및 생성자 public, protected 또는 private 액세스 한정자가 지정되지 않은 경우 클래스가 속한 클래스의 선언을 포함하는 패키지 전체에서 클래스 멤버 또는 생성자에 액세스 할 수 있습니다. 멤버가 선언되었지만 클래스 멤버 또는 생성자는 다른 패키지에서 액세스 할 수 없습니다.

공용 클래스에 기본 액세스 권한이있는 메서드 또는 생성자가있는 경우이 메서드 또는 생성자는이 패키지 외부에서 선언 된 하위 클래스에 액세스하거나 상속 할 수 없습니다.


2
그러나 "개인 패키지"는 어떻습니까? JLS에는 없습니다.
톰 Hawtin의 - tackline

-1

defaultpackage-private는 모두 동일하므로 동일한 패키지에있을 때까지 모든 클래스에서 둘 다 사용할 수 있습니다.

패키지 개인 용어는, 사실의 의미로 불린다 개인 으로 수정 민간 단지 같은 클래스로 제공되며 다른 클래스 나 서브 클래스가 같은 패키지 내에서 또는없이 액세스 할 수 없습니다 의미합니다.

따라서 package-private기본 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.