[java] 자바의 정적 클래스

static class자바 와 같은 것이 있습니까?

그러한 클래스의 의미는 무엇입니까? 정적 클래스의 모든 메소드 static도 필요 합니까?

다른 방법으로 클래스에 모든 정적 메소드가 포함되어 있으면 클래스도 정적이어야합니까?

정적 클래스는 무엇입니까?



답변

Java에는 정적 중첩 클래스가 있지만 최상위 정적 클래스를 찾고있는 것처럼 들립니다. Java는 최상위 클래스를 정적으로 만드는 방법이 없지만 다음과 같이 정적 클래스를 시뮬레이션 할 수 있습니다.

  • 클래스 선언 final-정적 클래스 확장이 의미가 없으므로 클래스 확장을 방지합니다.
  • 생성자 만들기 private-정적 클래스를 인스턴스화하는 것이 의미가 없으므로 클라이언트 코드로 인스턴스화를 방지합니다.
  • 클래스의 모든 멤버와 함수 만들기 static-클래스를 인스턴스화 할 수 없으므로 인스턴스 메소드를 호출하거나 인스턴스 필드에 액세스 할 수 없습니다.
  • 컴파일러는 인스턴스 (비 정적) 멤버를 선언하지 못하게합니다. 인스턴스 멤버를 호출하려고 할 때만 문제가 나타납니다.

위의 제안 당 간단한 예 :

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

정적 클래스는 무엇입니까? 정적 클래스를 잘 사용하면 인스턴스화가 적합하지 않은 일회성, 유틸리티 및 / 또는 라이브러리 클래스를 정의 할 수 있습니다. PI 및 E와 같은 수학적 상수를 포함하고 단순히 수학적 계산을 제공하는 Math 클래스가 좋은 예입니다. 이러한 경우 인스턴스화를 요구하는 것은 불필요하고 혼란 스러울 것입니다. Math클래스 및 소스 코드를 참조하십시오 . 그것 final과 그것의 모든 구성원이 임을 주목하십시오 static. Java가 최상위 클래스를 선언 할 수 있으면 staticMath 클래스는 정적 일 수 있습니다.


답변

Java에는 “정적 중첩 클래스”가 있지만 C #의 정적 클래스와 동일하지는 않습니다. 정적 중첩 클래스는 암시 적으로 외부 클래스의 인스턴스에 대한 참조가없는 클래스입니다.

정적 중첩 클래스는 인스턴스 메소드와 정적 메소드를 가질 수 있습니다.

Java에는 최상위 정적 클래스와 같은 것이 없습니다.


답변

정적 중첩 클래스가 있으며,이 [정적 중첩] 클래스는 인스턴스화되기 위해 둘러싸는 클래스의 인스턴스가 필요하지 않습니다.

이 클래스 [정적 중첩 클래스]는 포함 클래스의 정적 멤버에만 액세스 할 수 있습니다 (클로징 클래스의 인스턴스에 대한 참조가 없기 때문에 …]

코드 샘플 :

public class Test {
  class A { }
  static class B { }
  public static void main(String[] args) {
    /*will fail - compilation error, you need an instance of Test to instantiate A*/
    A a = new A();
    /*will compile successfully, not instance of Test is needed to instantiate B */
    B b = new B();
  }
}


답변

예, Java에는 정적 중첩 클래스가 있습니다. 중첩 클래스 정적을 선언하면 해당 클래스가 속한 외부 클래스를 인스턴스화하지 않고 인스턴스화 할 수있는 독립형 클래스가 자동으로됩니다.

예:

public class A
{

 public static class B
 {
 }
}

class Bstatic으로 선언 되었으므로 다음과 같이 명시 적으로 인스턴스화 할 수 있습니다.

B b = new B();

class B독립형으로 만들기 위해 정적으로 선언되지 않은 경우 인스턴스 객체 호출은 다음과 같습니다.

A a= new A();
B b = a.new B();


답변

내부 구성원 classstatic.. 로 선언되면 어떻게 되나요? 해당 멤버는을 인스턴스화하지 않고 액세스 할 수 있습니다 class. 따라서 외부 클래스 (최상위 클래스)를 만드는 것은 static의미가 없습니다. 따라서 허용되지 않습니다.

그러나 내부 클래스를 정적으로 설정할 수 있습니다 (최상위 클래스의 멤버이므로). 그러면 최상위 클래스를 인스턴스화하지 않고도 해당 클래스에 액세스 할 수 있습니다. 다음 예를 고려하십시오.

public class A {
    public static class B {

    }
}

이제 다른 클래스 안에서 class 인스턴스를 만들지 않고도 C클래스에 B액세스 할 수 있습니다 A.

public class C {
    A.B ab = new A.B();
}

static수업도 non-static회원이 될 수 있습니다 . 클래스 만 정적 상태가됩니다.

그러나 static 키워드가 클래스 B에서 제거 되면 인스턴스를 만들지 않고 직접 액세스 할 수 없습니다 A.

public class C {
    A a = new A();
    A.B ab = a. new B();
}

그러나 우리는 내부 수업에 static회원을 가질 수 없습니다 non-static.


답변

이것이 “정적 클래스 java”에 대한 Google의 최고 결과이며 최고의 답변이 여기에 없다는 것을 알았습니다. OP의 질문을 C #의 정적 클래스와 관련하여 Java 세계에서 싱글 톤이라고하는 것으로 해석하고 있습니다. C #에서 “정적”키워드를 클래스 선언에 적용하면 결과 클래스를 인스턴스화 할 수 없습니다.

Joshua Bloch의 “Effective Java-Second Edition”에서 발췌 (일반적으로 사용 가능한 최고의 Java 스타일 안내서 중 하나로 간주 됨) :

릴리스 1.5부터 싱글 톤을 구현하는 세 번째 방법이 있습니다. 단순히 하나의 요소로 열거 형을 만드십시오.

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

이 접근법은보다 간결하고 직렬화 기계를 무료로 제공하며 정교한 직렬화 또는 리플렉션 공격에도 불구하고 다중 인스턴스화에 대한 확실한 보증을 제공한다는 점을 제외하고는 공공 현장 접근 방식과 기능적으로 동일합니다. 이 방법은 아직 널리 채택되지 않았지만 단일 요소 열거 형 유형이 싱글 톤을 구현하는 가장 좋은 방법입니다. (강조 저자)

조슈아 블로흐 (2008-05-08). 효과적인 Java (Java Series) (p. 18). 피어슨 교육.

나는 구현과 정당화가 매우 자명하다고 생각합니다.


답변

Java에서 클래스가 정적 일 수 있습니까?

대답은 YES 입니다. java에서 정적 클래스를 가질 수 있습니다. 자바에는 정적 인스턴스 변수정적 메소드정적 블록이 있습니다. 있습니다. Java에서 클래스를 정적으로 만들 수도 있습니다.

자바에서는 최상위 (외부) 클래스를 정적으로 만들 수 없습니다. 중첩 클래스 만 정적 일 수 있습니다.

정적 중첩 클래스 대 비 정적 중첩 클래스

1) 중첩 정적 클래스에는 외부 클래스에 대한 참조가 필요하지 않지만 비 정적 중첩 클래스 또는 내부 클래스에는 외부 클래스 참조가 필요합니다.

2) 내부 클래스 (또는 비 정적 중첩 클래스)는 외부 클래스의 정적 및 비 정적 멤버 모두에 액세스 할 수 있습니다. 정적 클래스는 Outer 클래스의 비 정적 멤버에 액세스 할 수 없습니다. 외부 클래스의 정적 멤버에만 액세스 할 수 있습니다.

여기를 참조하십시오 : https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html