[java] Java에서 클래스를 정적 ​​클래스로 선언 할 수없는 이유는 무엇입니까?

Java에서 클래스를 정적 ​​클래스로 선언 할 수없는 이유는 무엇입니까?



답변

중첩 클래스 만 정적 일 수 있습니다. 이렇게하면 외부 클래스의 인스턴스가 없어도 중첩 클래스를 사용할 수 있습니다.

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

출처 :

같은 주제에서 :


답변

최상위 클래스는 기본적으로 정적입니다. 내부 클래스는 기본적으로 정적이지 않습니다. 내부 클래스를 정적으로 명시 적으로 표시하여 내부 클래스의 기본값을 변경할 수 있습니다. 최상위 수준이기 때문에 최상위 클래스는 참조 할 부모 클래스가 없기 때문에 정적이 아닌 의미를 가질 수 없습니다. 따라서 최상위 클래스의 기본값을 변경할 방법이 없습니다.


답변

그래서, 나는 파티에 늦게오고 있지만, 여기에는 철학적으로 콜린 헤 버트의 대답에 추가하는 2 센트가 있습니다.

높은 수준에서 질문은 객체와 유형의 차이를 처리합니다. 많은 자동차 (객체)가 있지만 Car 클래스 (유형)는 하나뿐입니다. 무언가를 정적으로 선언한다는 것은 “타입”공간에서 작업하고 있다는 것을 의미합니다. 하나만 있습니다. 최상위 클래스 키워드는 이미 “type”공간에서 유형을 정의합니다. 결과적으로 “공용 정적 클래스 Car”는 중복됩니다.


답변

개인 생성자가있는 클래스는 정적입니다.

다음과 같이 수업을 선언하십시오.

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

초기화하지 않고 사용할 수 있습니다.

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...


답변

물론 내부 중첩 클래스 만 가능 합니다. 즉, 중첩 클래스의 인스턴스에는 외부 클래스의 엔 클로징 인스턴스가 필요하지 않습니다.

그러나 최상위 클래스의 경우 언어 디자이너는 키워드와 관련하여 유용한 것을 생각할 수 없으므로 허용되지 않습니다.


답변

인스턴스없이 열거 형을 선언하여 인스턴스를 작성할 수없는 유틸리티 클래스를 작성할 수 있습니다. 즉, 인스턴스가 없다고 구체적으로 선언하고 있습니다.

public enum MyUtilities {;
   public static void myMethod();
}


답변

public class Outer {
   public static class Inner {}
}

… 멤버 클래스 인 한 정적로 선언 할 수 있습니다.

JLS에서 :

멤버 클래스는 정적 일 수 있으며이 경우 주변 클래스의 인스턴스 변수에 액세스 할 수 없습니다. 또는 내부 클래스 일 수 있습니다 (§8.1.3).

그리고 여기:

static 키워드는 내부 클래스가 아닌 클래스 T 본문 내에서 멤버 유형 C의 선언을 수정할 수 있습니다. 그 효과는 C가 내부 클래스가 아니라고 선언하는 것입니다. T의 정적 메소드에 본문에 현재 T의 인스턴스가없는 것처럼 C에도 현재 T의 인스턴스가 없으며 어휘 적으로 둘러싸인 인스턴스도 없습니다.

정적 키워드는 최상위 클래스에 엔 클로징 유형이 없기 때문에 최상위 클래스에는 의미가 없습니다.