[java] Java의 기본 액세스 지정자는 무엇입니까?

방금 Java 책을 읽기 시작했고 궁금했습니다. 지정되지 않은 경우 기본 액세스 지정자는 무엇입니까?



답변

기본 가시성은 “package-private”(명시 적으로 사용할 수는 없지만)로 알려져 있습니다. 즉, 클래스가 속한 동일한 패키지 내에서 필드에 액세스 할 수 있습니다.

mdma가 지적했듯이, 기본값이 “public”인 인터페이스 멤버에게는 사실이 아닙니다.

Java의 액세스 지정자 참조


답변

기본 지정자는 컨텍스트에 따라 다릅니다.

클래스 및 인터페이스 선언의 경우 기본값은 패키지 전용입니다. 이것은 보호 된 것과 개인용 사이에 속하며 동일한 패키지 액세스의 클래스 만 허용합니다. (protected는 이와 비슷하지만 패키지 외부의 하위 클래스에 대한 액세스도 허용합니다.)

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

인터페이스 멤버 (필드 및 메서드)의 경우 기본 액세스는 공용입니다. 그러나 인터페이스 선언 자체의 기본값은 private 패키지입니다.

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

그런 다음 선언이 있으면

public interface MyInterface2 extends MyInterface
{

}

MyInterface2를 사용하는 클래스는 MyInterface 자체의 선언을 볼 수 없더라도 공용이므로 super 인터페이스에서 field1 및 method1을 볼 수 있습니다.


답변

액세스 지정자가 제공되지 않으면 클래스 및 클래스 멤버에 대한 패키지 수준 액세스입니다 (이에 대한 명시 적 지정자는 없음). 인터페이스 메서드는 암시 적으로 공개됩니다.


답변

기본 가시성 (NO 키워드)입니다 패키지 는 동일한 패키지에 위치하는 모든 클래스에 사용할 수 있다고하는 의미합니다.

흥미로운 점은 protected 가 하위 클래스뿐만 아니라 동일한 패키지의 다른 클래스에 대한 가시성을 제한하지 않는다는 것입니다.


답변

그것이 무엇인지에 달려 있습니다.

  • 최상위 유형 (즉, 다른 유형 내에서 선언되지 않은 클래스, 열거 형, 인터페이스 및 주석 유형)은 기본적으로 패키지 전용 입니다. ( JLS §6.6.1 )

  • 클래스에서 모든 멤버 (필드, 메서드 및 중첩 된 형식 선언을 의미 함)와 생성자는 기본적으로 패키지 전용 입니다. ( JLS §6.6.1 )

    • 클래스에 명시 적으로 선언 된 생성자가없는 경우 컴파일러 는 클래스와 동일한 액세스 지정자 를 가진 인수가없는 기본 생성자를 삽입합니다 . ( JLS §8.8.9 ) 기본 생성자는 일반적으로 항상 공개로 잘못 표시되지만 드물게는 동일하지 않습니다.
  • 열거 형에서 생성자는 기본적으로 비공개 입니다. 실제로 enum contructor private 이어야 하며 public 또는 protected로 지정하는 것은 오류입니다. 열거 형 상수는 항상 public 이며 액세스 지정자를 허용하지 않습니다. 열거 형의 다른 멤버는 기본적으로 패키지 전용 입니다. ( JLS §8.9 )

  • 인터페이스 및 주석 유형에서 모든 멤버 (다시 말하면 필드, 메서드 및 중첩 유형 선언을 의미 함)는 기본적으로 공용 입니다. 실제로 인터페이스 및 주석 유형의 멤버는 공용 이어야 하며이를 개인 또는 보호로 지정하는 것은 오류입니다. ( JLS §9.3 ~ 9.5 )

  • 로컬 클래스는 메서드, 생성자 또는 이니셜 라이저 블록 내에 선언 된 명명 된 클래스입니다. 이들은 선언 된 .. 블록 으로 범위{}지정되며 액세스 지정자를 허용하지 않습니다. ( JLS §14.3 ) 리플렉션을 사용하면 다른 곳에서 로컬 클래스를 인스턴스화 할 수 있으며 해당 세부 사항이 JLS에 있는지 확실하지 않지만 package-private 입니다.

  • 익명 클래스는 new표현식에서 직접 클래스 본문을 지정하는 데 사용 되는 사용자 정의 클래스입니다 . ( JLS §15.9.5 ) 해당 구문은 액세스 지정자를 허용하지 않습니다. 리플렉션을 사용하면 다른 곳에서 익명 클래스를 인스턴스화 할 수 있으며 해당 세부 사항이 JLS에 있는지 확실하지 않지만 둘 다 및 생성 된 생성자는 package-private 입니다.

  • 인스턴스 및 정적 이니셜 라이저 블록에는 언어 수준 ( JLS §8.6 및 8.7 ) 에서 액세스 지정자가 없지만 정적 이니셜 라이저 블록은 이름이 지정된 메서드 <clinit>( JVMS §2.9 ) 로 구현 되므로 메서드에는 내부적으로 일부 액세스 지정자가 있어야합니다. 16 진 편집기를 사용하여 javac 및 Eclipse의 컴파일러로 컴파일 된 클래스를 검사 한 결과 둘 다 package-private 로 메서드를 생성한다는 것을 발견했습니다 . 그러나 메서드 이름에서 및 문자가 유효하지 않고 리플렉션 메서드가 그 존재를 거부하도록 고정되어 <clinit>()있기 때문에 언어 내에서 호출 할 수 없으므로 액세스 지정자는 액세스 권한없습니다 . 이 메서드는 클래스 초기화 중에 VM에서만 호출 할 수 있습니다.<>인스턴스 이니셜 라이저 블록은 별도의 메서드로 컴파일되지 않습니다. 그들의 코드는 각 생성자에 복사되므로 리플렉션을 통해서도 개별적으로 액세스 할 수 없습니다.


답변

default 는 메소드 및 변수에 대한 액세스 수정 자로 사용되는 키워드입니다.
이 액세스 수정자를 사용하면 클래스, 변수, 메서드 또는 생성자가 자신의 클래스 또는 패키지에서 액세스 할 수있게되며 액세스 수정자가없는 경우에도 설정됩니다.

  Access Levels
    Modifier    Class   Package Subclass  EveryWhere
    public        Y        Y       Y         Y
    protected     Y        Y       Y         N
    default       Y        Y       N         N
    private       Y        N       N         N

인터페이스에서 기본값을 사용하면이 예제와 같은 메서드를 구현할 수 있습니다.

public interface Computer {    
    default void Start() {
        throw new UnsupportedOperationException("Error");
    }    
}

그러나 8 Java 버전에서만 작동합니다.

공식 문서

Java의 액세스 수정 자


답변

자세한 내용은 여기 를 참조하십시오. 기본값은 비공개 / 공개 / 보호가 아니지만 완전히 다른 액세스 사양입니다. 널리 사용되지 않으며 액세스 정의를 훨씬 더 구체적으로 지정하는 것을 선호합니다.