programing

Java에서 클래스를 스태틱으로 선언할 수 없는 이유는 무엇입니까?

sourcetip 2022. 8. 8. 22:57
반응형

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();
}

출처:

같은 토픽에 대해서:

최상위 클래스는 기본적으로 스태틱입니다.내부 클래스는 기본적으로는 비정적입니다.내부 클래스를 명시적으로 static으로 표시함으로써 내부 클래스의 기본값을 변경할 수 있습니다.참조할 부모 클래스가 없기 때문에 최상위 클래스는 최상위 수준이기 때문에 비정적 의미론을 가질 수 없습니다.따라서 최상위 클래스의 기본값을 변경할 수 없습니다.

그래서, 저는 파티에 늦게 오지만, 여기 제 의견이 있습니다. - 철학적으로 콜린 헤버트의 답변에 더해져요.

대략적으로 당신의 질문은 개체와 유형의 차이를 다루고 있습니다.차량(객체)은 많지만 차량 클래스(종류)는 1개뿐입니다.정적이라고 선언하는 것은 "유형" 공간에서 작업하고 있음을 의미합니다.하나밖에 없어요.top-level class 키워드가 "type" 공간에 유형을 이미 정의했습니다.그 결과 "public static class 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의 현재 인스턴스가 없고 사전적으로 둘러싸인 인스턴스가 없습니다.

최상위 클래스에는 둘러싸는 유형이 없기 때문에 static 키워드는 최상위 클래스에는 의미가 없습니다.

위에서 설명한 바와 같이 클래스는 다른 클래스의 멤버가 아니면 정적일 수 없습니다.

"복수의 인스턴스가 존재할 수 없는" 클래스를 설계하려는 경우 "싱글톤" 설계 패턴을 검토할 수 있습니다.

싱글턴 초보자 정보는 이쪽입니다.

경고:

싱글톤 패턴을 사용할 생각이라면, 온 힘을 다해 저항해 주세요.이것은 가장 이해하기 쉬운 디자인 패턴 중 하나이며, 아마도 가장 많이 사용되고 가장 많이 악용될 것입니다.(출처: 위의 링크와 같은 Java Ranch)

Java가 정적 내부 클래스를 정의하는 방법 외에도 C# 월드[1]에 따라 정적 클래스의 다른 정의가 있습니다.정적 클래스는 정적 메서드(함수)만 있는 클래스로 절차적 프로그래밍을 지원합니다.이러한 클래스는 클래스 사용자가 도우미 기능에만 관심이 있고 클래스의 인스턴스를 만드는 데는 관심이 없다는 점에서 실제로는 클래스가 아닙니다.스태틱 클래스는 C#에서 지원되지만 Java에서는 직접 지원되지 않습니다.단, Java에서 enum을 사용하여 C# 스태틱클래스를 모방할 수 있기 때문에 사용자는 (반사를 사용해도) 특정 클래스의 인스턴스를 작성할 수 없습니다.[ 2 ] :

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}

자바에서 코드화한 모든 것이 클래스로 들어갑니다.클래스를 실행할 때마다 JVM은 개체를 인스턴스화합니다.JVM은 여러 개체를 생성할 수 있습니다. 정의상 스태틱은 모든 개체에 대해 동일한 복사본 집합을 갖는 것을 의미합니다.

따라서 Java가 프로그램을 실행할 때마다 상위 클래스가 정적인 것을 허용하면 오브젝트가 생성되고 동일한 메모리 위치에 계속 덮어씁니다.

실행할 때마다 개체를 교체하는 경우 개체를 만드는 목적이 무엇입니까?

이것이 Java가 최상위 클래스의 스태틱을 제거한 이유입니다.

더 구체적인 이유가 있을 수 있지만, 이것은 나에게 훨씬 논리적으로 이해되었다.

스태틱할 수 있는 클래스는 내부 클래스뿐입니다.다음 코드는 정상적으로 동작합니다.

public class whatever {
    static class innerclass {
    }
}

정적 내부 클래스의 요점은 외부 클래스 객체에 대한 참조가 없다는 것입니다.

이건 커피 한 잔 마시는 것만큼이나 쉬운 일이라고 생각해!이것 좀 보세요.클래스를 정의할 때는 static 키워드를 명시적으로 사용하지 않습니다.

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

그거 정적 클래스의 정의 아닌가요?클래스에만 바인딩된 함수를 사용합니다.이 경우 네스트된 클래스에서 다른 클래스를 사용할 수 있습니다.이것 좀 봐.

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

볼 수 있다PlatformUIEclipse에서는 정적 메서드와 프라이빗 컨스트럭터 자체를 최종으로 하는 클래스에 대해 설명합니다.

public final class <class name>
{
   //static constants
   //static memebers
}

static-class를 사용하는 장점이 오브젝트를 인스턴스화하지 않고 메서드를 사용하는 경우 클래스를 public으로, 이 메서드를 static으로 선언합니다.

언급URL : https://stackoverflow.com/questions/3584113/why-are-you-not-able-to-declare-a-class-as-static-in-java

반응형