Java에서 클래스를 정적 클래스로 선언 할 수없는 이유는 무엇입니까?
static
클래스를로 해석 합니다 abstract final
. 즉, 인스턴스화 할 수없고 확장 할 수 없습니다. 이는 정적 멤버 만 포함 할 수 있음을 의미하며 이는 도우미 메소드 만 포함하는 클래스에 유용합니다.
Java에서 클래스를 정적 클래스로 선언 할 수없는 이유는 무엇입니까?
static
클래스를로 해석 합니다 abstract final
. 즉, 인스턴스화 할 수없고 확장 할 수 없습니다. 이는 정적 멤버 만 포함 할 수 있음을 의미하며 이는 도우미 메소드 만 포함하는 클래스에 유용합니다.
답변:
중첩 클래스 만 정적 일 수 있습니다. 이렇게하면 외부 클래스의 인스턴스가 없어도 중첩 클래스를 사용할 수 있습니다.
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
최상위 클래스 의 키워드가 정적 멤버 만 포함하고 인스턴스화되지 않을 수 있음을 표시하고 시행하도록 허용 할 수 있습니다. 그러나 static
중첩 클래스에 대해 다른 의미를 갖는 것처럼 사람들을 혼란스럽게 만들 수 있습니다.
그래서, 나는 파티에 늦게오고 있지만, 여기에는 철학적으로 콜린 헤 버트의 대답에 추가하는 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();
...
static class
C #에서 선언 의 영향 ) 컴파일러는 코드가 해당 유형의 변수를 선언하거나 일반 유형 매개 변수로 사용하도록 허용하지 않습니다. 인스턴스화되거나 상속 될 수있는 클래스에 액세스 가능한 생성자가 부족한 경우 해당 유형의 변수 선언이나 일반 유형 매개 변수로의 사용을 배제하지 않습니다.
물론 내부 중첩 클래스 만 가능 합니다. 즉, 중첩 클래스의 인스턴스에는 외부 클래스의 엔 클로징 인스턴스가 필요하지 않습니다.
그러나 최상위 클래스의 경우 언어 디자이너는 키워드와 관련하여 유용한 것을 생각할 수 없으므로 허용되지 않습니다.
static
때로는 가능할 수도 있습니다. 예를 들어, 정적 헬퍼 메소드 만 포함하는 클래스는 인스턴스화하는 것이 의미가 없지만 Java 언어는이를 수행하지 못하게합니다. 기본 생성자를 선언하여 클래스를 인스턴스화 할 수없고 (실제로는 '정적') private
만들 수 있습니다. 생성자가 보이지 않기 때문에 인스턴스화가 금지됩니다.
인스턴스없이 열거 형을 선언하여 인스턴스를 작성할 수없는 유틸리티 클래스를 작성할 수 있습니다. 즉, 인스턴스가 없다고 구체적으로 선언하고 있습니다.
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의 인스턴스가 없으며 어휘 적으로 둘러싸인 인스턴스도 없습니다.
정적 키워드는 최상위 클래스에 엔 클로징 유형이 없기 때문에 최상위 클래스에는 의미가 없습니다.
Inner
합니까? Nested
덜 혼란스러운 선택이었을 것입니다.
Java가 정적 내부 클래스를 정의하는 방법 외에도 C # 세계에 따라 다른 정적 클래스 정의가 있습니다 [1] . 정적 클래스는 정적 메서드 (함수) 만 가지고 있으며 절차 적 프로그래밍을 지원하기위한 클래스입니다. 이러한 클래스는 클래스의 사용자가 클래스의 인스턴스를 작성하는 것이 아니라 도우미 함수에만 관심이 있다는 점에서 실제로 클래스가 아닙니다. 정적 클래스는 C #에서 지원되지만 Java에는 이러한 직접 지원이 없습니다. 그러나 enum을 사용하여 Java에서 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가 프로그램을 실행할 때마다 최상위 클래스가 정적임을 허용하면 Object를 작성하고 동일한 메모리 위치를 계속 재정의합니다.
매번 실행할 때마다 객체를 바꾸는 경우 객체를 만드는 시점은 무엇입니까?
그래서 Java가 최상위 클래스에 대한 정적을 제거 한 이유입니다.
더 구체적인 이유가있을 수 있지만 이것은 나에게 많은 논리적 의미가 있습니다.
나는 커피 한 잔을 마시는 것만 큼 쉽다고 생각합니다!. 이것 좀 봐 클래스를 정의하는 동안 정적 키워드를 명시 적으로 사용하지 않습니다.
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);
}
}
new StaticClass()
실제로는 의미가 없습니다. 개인 생성자를 사용하면 인스턴스를 허용하지 않습니다.
PlatformUI
정적 메소드와 개인 생성자가 최종 클래스 인 클래스를 Eclipse 에서 살펴볼 수 있습니다 .
public final class <class name>
{
//static constants
//static memebers
}
static
됩니까?