Java에서 기본 액세스 지정자는 무엇입니까?
자바 북을 읽기 시작한 지 얼마 안 돼서 궁금했는데, 아무것도 지정되어 있지 않은 경우 기본 접근 지정자는 무엇입니까?
기본 가시성은 "package-private"로 알려져 있습니다(단, 명시적으로 사용할 수는 없습니다). 즉, 클래스가 속한 동일한 패키지 내부에서 필드에 액세스할 수 있습니다.
단, mdma가 지적한 바와 같이 인터페이스 멤버에게는 해당되지 않습니다.기본값은 "public"입니다.
Java의 액세스 지정자 참조
기본 지정자는 컨텍스트에 따라 달라집니다.
클래스 및 인터페이스 선언의 경우 기본값은 package private입니다.이는 보호됨과 개인 사이에 있으며 동일한 패키지의 클래스만 액세스할 수 있습니다.(보호는 이와 동일하지만 패키지 외부의 서브클래스에 대한 접근도 허용됩니다.
class MyClass // package private
{
int field; // package private field
void calc() { // package private method
}
}
인터페이스 멤버(필드 및 메서드)의 경우 기본 액세스는 public입니다.단, 인터페이스 선언 자체는 기본적으로 package private로 되어 있습니다.
interface MyInterface // package private
{
int field1; // static final public
void method1(); // public abstract
}
만약 그 선언이 있다면
public interface MyInterface2 extends MyInterface
{
}
MyInterface2를 사용하는 클래스는 MyInterface 자체의 선언을 볼 수 없지만 퍼블릭이기 때문에 슈퍼 인터페이스에서 field1 및 method1을 볼 수 있습니다.
액세스 지정자가 지정되지 않은 경우 클래스 및 클래스 구성원에 대한 패키지 수준의 액세스입니다(이것에 대한 명시적 지정자는 없습니다).인터페이스 방식은 암묵적으로 공개됩니다.
기본 가시성(키워드 없음)은 패키지이며, 이는 동일한 패키지에 있는 모든 클래스에서 사용할 수 있음을 의미합니다.
흥미로운 점은 보호는 하위 클래스뿐만 아니라 동일한 패키지의 다른 클래스에도 가시성을 제한한다는 것입니다.
그것은 무엇이냐에 달려있다.
최상위 유형(즉, 클래스, enum, 인터페이스 및 주석 유형이 다른 유형 내에서 선언되지 않음)은 기본적으로 패키지 전용입니다(JLS 6.6.1).
클래스에서는 모든 멤버(필드, 메서드 및 네스트타입 선언을 의미)와 컨스트럭터는 디폴트로 package-private입니다.(JLS 6 6 . 6 . 1 )
- 클래스에 명시적으로 선언된 생성자가 없는 경우 컴파일러는 클래스와 동일한 액세스 지정자를 가진 기본 제로 인수 생성자를 삽입합니다.(JLS § 8.8.9) 디폴트 컨스트럭터는 일반적으로 항상 공개되어 있는 것으로 잘못 기술되어 있습니다만, 드물게는 동등하지 않은 경우도 있습니다.
enum에서 컨스트럭터는 기본적으로 비공개입니다.실제로 열거형 컨스트럭터는 비공개여야 하며 public 또는 protected로 지정하는 것은 오류입니다.Enum 상수는 항상 공용이며 액세스 지정자를 허용하지 않습니다.enum의 다른 멤버는 디폴트로 package-private입니다.(JLS § 8 . 9 )
인터페이스 및 주석 유형에서는 기본적으로 모든 구성원(필드, 메서드 및 중첩된 유형 선언을 의미)이 공개됩니다.실제로 인터페이스 및 주석 유형의 멤버는 공개되어야 하며, 이를 개인 또는 보호 유형으로 지정하는 것은 오류입니다.(JLS 99.3 ~ 9.5)
로컬 클래스는 메서드, 생성자 또는 이니셜라이저 블록 내에서 선언된 명명된 클래스입니다.선언된 ..
}
블록까지 범위가 지정되며 액세스 지정자는 허용되지 않습니다.(JLS 1414.3) 리플렉션을 사용하여 다른 곳에서 로컬 클래스를 인스턴스화할 수 있으며, 패키지 전용이지만, 자세한 내용은 JLS에 기재되어 있는지 알 수 없습니다.입니다.
new
식에서 클래스 본문을 직접 지정합니다.(JLS '15.9.5) 구문에 의해 액세스 지정자는 허용되지 않습니다.Reflection을 사용하면 다른 곳에서 익명의 클래스를 인스턴스화할 수 있으며 생성된 생성자 모두 패키지 전용이지만 자세한 내용이 JLS에 있는지 알 수 없습니다.인스턴스 블록과 스태틱인테셜라이저 블록에는 언어 수준(JLS 8 8.6 & 8.7)의 액세스 지정자가 없지만 스태틱인테셜라이저 블록은 다음과 같은 이름의 방법으로 구현됩니다.
<clinit>
(JVMS 2 2 . 9 )따라서 메서드 내부에는 액세스 지정자가 필요합니다.16진 에디터를 사용하여 javac과 Eclipse의 컴파일러에 의해 컴파일된 클래스를 조사했더니 둘 다 패키지-프라이빗으로 메서드를 생성합니다.단, 전화는 할 수 없습니다.<clinit>()
안에 것은 어 within the the가 있기 입니다.<
★★★★★★★★★★★★★★★★★」>
메서드 이름에는 문자가 유효하지 않습니다.반사 메서드는 그 존재를 거부하도록 유선 연결되어 있기 때문에 사실상 액세스 지정자는 액세스 할 수 없습니다.메서드는 클래스 초기화 중에 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 버전에서만 동작합니다.
자세한 내용은 여기를 참조하십시오.기본값은 프라이빗/퍼블릭/보호되지 않고 완전히 다른 액세스 사양입니다.널리 사용되고 있지 않기 때문에, 액세스의 정의를 보다 구체적으로 하고 싶다고 생각하고 있습니다.
기본 액세스 지정자는 package 입니다.클래스는 동일한 패키지의 다른 클래스 멤버에 액세스할 수 있습니다.하지만 패키지 밖에서는 비공개인 것처럼 보입니다.
Java의 크리에이터인 James Gosling과의 인터뷰에서 패키지 수준의 가시성에 대해 다음과 같이 인용합니다.
Bill Venners: Java에는 네 가지 액세스 레벨이 있습니다.기본값은 package 입니다.C++에서 온 사람들이 이미 알고 있는 세 가지 키워드는 프라이빗, 프로텍티드, 퍼블릭이기 때문에 패키지 액세스를 디폴트로 하는 것이 편리한지 항상 궁금했습니다.또는 패키지 액세스가 기본이어야 한다고 생각되는 특별한 이유가 있는 경우.
James Gosling: 패키지는 일반적으로 함께 쓰여진 일련의 것입니다.그래서 일반적으로 나는 두 가지 중 하나를 할 수 있었다.하나는 도메인이 주어지는 키워드를 항상 입력하도록 강요하는 것입니다.아니면 기본값을 사용할 수도 있습니다.그리고 문제는 무엇이 합리적인 디폴트를 만드는가 하는 것입니다.그리고 나는 가장 덜 위험한 것을 선택하는 경향이 있다.
그래서 디폴트(채무불이행)를 하는 것은 정말 나쁜 일이었을 것이다.만약 사람들이 실제로 사적인 방법을 그렇게 자주 쓰지 않기 때문이라면, 프라이빗은 디폴트(채무불이행)를 하는 것은 아마도 나쁜 일일 것이다.그리고 보호받는 것도 마찬가지야그리고 제가 가지고 있는 많은 코드를 보면서 저는 가장 일반적인 것이 패키지에 들어있다고 생각했습니다.C++는 패키지에 대한 개념이 없었기 때문에 키워드가 없었습니다.
하지만 저는 친구라는 개념보다 더 좋았습니다. 왜냐하면 친구라면 친구가 누구인지를 열거해야 하기 때문입니다. 그래서 패키지에 새로운 클래스를 추가하면, 그 패키지에 있는 모든 수업에 가서 친구들을 업데이트해야 하기 때문입니다. 저는 항상 그런 생각이 들었습니다.
하지만 친구 목록 자체가 일종의 버전 관리 문제를 일으킵니다.그래서 친근한 수업이라는 개념이 있었습니다.디폴트로 한 것은 문제 해결하겠습니다.키워드는 무엇이어야 할까요?
한동안 실제로 친근한 키워드가 있었다.하지만 다른 모든 것들은 "P"로 시작하니까, "친구처럼" "PH"로 시작하죠. 하지만 그건 하루 정도 밖에 없었어요.
http://www.artima.com/intv/gosling2P.html
Java 8 사용 현황 업데이트default
없음다른 많은 사람들이 지적했듯이 기본 가시성(키워드 없음)
클래스가 속한 동일한 패키지 내에서 필드에 액세스할 수 있습니다.
새로운 Java 8 기능(Default Methods)과 혼동하지 마십시오.이 기능에서는, 인터페이스에는 다음의 라벨이 붙어 있는 경우에 실장을 제공할 수 있습니다.default
키워드를 지정합니다.
참조: 액세스 수식자
JAVA에는 "default"라는 액세스 수식어가 있어 해당 패키지 내에서만 해당 엔티티의 인스턴스를 직접 생성할 수 있습니다.
다음은 유용한 링크입니다.
먼저 Java에는 "Access specifier"라는 용어가 없습니다.우리는 모든 것을 '수정자'라고 불러야 한다.우리가 알다시피, 최종적이고, 정적이고, 동기적이고, 휘발성 있는...는 수식자로 불리며, Public, private, protected, default, abstract도 수식자로 불리어야 합니다.기본값은 물리적인 존재는 없지만 수식자가 배치되지 않은 수식자로 기본 수식자로 취급해야 합니다.
이를 정당화하기 위해 한 가지 예를 들 수 있습니다.
public class Simple{
public static void main(String args[]){
System.out.println("Hello Java");
}
}
은 다음과 같습니다.Hello Java
이제 public을 private로 변경하여 어떤 컴파일러 오류가 발생하는지 확인합니다."여기에는 수식어 개인은 허용되지 않습니다."라고 쓰여 있습니다. 어떤 결론은 누군가 틀릴 수도 있고 일부 튜토리얼은 틀릴 수도 있지만 컴파일러는 틀릴 수 없습니다.따라서 자바에는 모든 것이 수식어라는 용어 액세스 지정자가 없다고 할 수 있습니다.
언급URL : https://stackoverflow.com/questions/3530065/what-is-the-default-access-specifier-in-java
'programing' 카테고리의 다른 글
JavaScript - URL 경로의 일부를 가져옵니다. (0) | 2022.11.02 |
---|---|
c의 레이트레이스에서의 카메라 셋업 (0) | 2022.11.02 |
MySQL에서 MariaDB로 이동 - 외부 키 제약 조건이 잘못 형성되었습니다. (0) | 2022.11.02 |
문자열을 소문자로 변환하는 MySQL 명령어가 있습니까? (0) | 2022.11.01 |
PHP의 해시에 bcrypt를 사용하는 방법은 무엇입니까? (0) | 2022.11.01 |