programing

Java의 스태틱클래스

goodcopy 2022. 8. 3. 21:42
반응형

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와 같은 일부 수학 상수를 포함하고 단순히 수학적 계산을 제공하는 수학 수업입니다.이러한 경우 인스턴스화를 요구하는 것은 불필요하고 혼란스러울 수 있습니다.클래스 및 소스 코드를 참조하십시오.주의하세요final 그 는 모두 리 and and and and and and and and이다.static. 수 있도록 허용한 . Java는 최상위 클래스입니다static그러면 수학 수업은 정말로 정적이 될 것이다.

Java에는 스태틱네스트 클래스가 있지만 C#의 스태틱클래스와는 전혀 다릅니다.스태틱 네스트클래스는 외부 클래스의 인스턴스를 암묵적으로 참조하지 않는 클래스입니다.

스태틱 네스트클래스에는 인스턴스 메서드 및 스태틱메서드를 사용할 수 있습니다.

Java에는 최상위 수준의 정적 클래스가 없습니다.

스태틱 네스트 클래스가 있습니다.이 [static nested]클래스는 그 자체를 인스턴스화하기 위해 엔클로징 클래스의 인스턴스가 필요하지 않습니다.

이러한 클래스[스태틱네스트된 클래스]는 [인클로징 클래스의 인스턴스에 대한 참조가 없기 때문에]인클로징 클래스의 스태틱멤버에만 액세스 할 수 있습니다

코드 샘플:

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에는 스태틱네스트 클래스가 있습니다.중첩된 클래스가 static임을 선언하면 해당 클래스가 속한 외부 클래스를 인스턴스화할 필요 없이 자동으로 인스턴스화할 수 있는 독립 실행형 클래스가 됩니다.

예:

public class A
{

 public static class B
 {
 }
}

★★★★★★★★★★★★★★★★★★class B다음과 같이 명시적으로 인스턴스화할 수 있습니다.

B b = new B();

:class Bstatic 오브젝트 콜은 다음과 같습니다.

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

class라고 static그하지 않고 할 수 ...? 이 멤버는, 인스톨 하지 않고 액세스 할 수 있습니다.class 외부 클래스를 만듭니다.static미가없없 없없없다다따라서 허용되지 않습니다.

단, 내부 클래스는 (최상위 클래스의 멤버이기 때문에) 스태틱으로 설정할 수 있습니다.그러면 최상위 클래스를 인스턴스화하지 않고도 해당 클래스에 액세스할 수 있습니다.다음 예를 생각해 보겠습니다.

public class A {
    public static class B {

    }
}

이제 에서는요, 、 른 、 른 、 른 。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();
}

는 지만만우 but but but but but but but but but but but를 가질 수 없습니다.static non-static내적 계급

Java에서는 클래스가 스태틱할 수 있습니까?

정답은 "예"입니다. Java에서 정적 클래스를 사용할 수 있습니다.Java에는 정적 인스턴스 변수정적 메서드 및 정적 블록이 있습니다.Java에서는 클래스를 정적으로 만들 수도 있습니다.

Java에서는 최상위(외부) 클래스를 정적으로 만들 수 없습니다.네스트된 클래스만 스태틱할 수 있습니다.

스태틱 네스트클래스와 비 스태틱 네스트클래스

1) Nested static 클래스에는 Outer 클래스의 참조가 필요 없지만, Non-static nested 클래스 또는 Inner 클래스의 경우 Outer 클래스의 참조가 필요합니다.

2) Inner 클래스(또는 Non-Static Nested 클래스)는 Outer 클래스의 정적 멤버와 비정적 멤버 모두에 액세스할 수 있습니다.정적 클래스는 외부 클래스의 정적 멤버에 액세스할 수 없습니다.외부 클래스의 정적 멤버에만 액세스할 수 있습니다.

여기를 참조해 주세요.https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

이것이 구글에서 "static class java"에 대한 최고의 결과이고, 최선의 답은 여기에 없기 때문에 나는 그것을 추가해야겠다고 생각했다.저는 OP의 질문을 Java 세계에서는 싱글톤으로 알려진 C#의 정적 클래스에 관한 것으로 해석하고 있습니다.모르는 사람에게는 C#에서 "static" 키워드를 클래스 선언에 적용할 수 있습니다.즉, 결과 클래스는 인스턴스화할 수 없습니다.

Joshua Bloch의 "Effective Java - Second Edition"에서 발췌한 내용(이용 가능한 Java 스타일 가이드 중 가장 뛰어난 것으로 널리 평가됨):

릴리스 1.5에서는 싱글톤을 실장하기 위한 세 번째 접근방식이 있습니다.하나의 요소로 열거형을 작성하기만 하면 됩니다.

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

이 접근방식은 보다 간결하고 시리얼라이제이션머신을 무료로 제공하며 고도의 시리얼라이제이션 또는 리플렉션 공격 시에도 여러 인스턴스화에 대한 확실한 보증을 제공하는 것을 제외하고는 퍼블릭필드 접근방식과 기능적으로 동등합니다.이 접근방식은 아직 널리 채택되지 않았지만 단일 요소 열거형이 싱글톤을 구현하는 가장 좋은 방법이다.(저작자)

Bloch, Joshua (2008-08).효과적인 Java (Java 시리즈) (p.18)피어슨 교육

나는 구현과 정당화가 꽤 자기 설명적이라고 생각한다.

외부 클래스는 정적일 수 없지만 중첩/내부 클래스는 정적일 수 있습니다.기본적으로 외부 클래스의 인스턴스를 만들지 않고 중첩/내부 클래스를 사용할 수 있습니다.

간단히 말하면 Java는 클래스 선언을 내부 클래스에만 대해 정적이며 최상위 클래스에는 지원하지 않습니다.

최상위 클래스:Java 프로젝트는 각 Java 소스 파일에 둘 이상의 최상위 클래스를 포함할 수 있으며, 클래스 중 하나는 파일 이름을 따서 명명됩니다.최상위 클래스 앞에 허용되는 옵션 또는 키워드는 공개, 추상, 최종 세 가지뿐입니다.

내부 클래스: 최상위 클래스의 내부에 있는 클래스를 내부 클래스라고 합니다.이것은 기본적으로 중첩된 클래스의 개념입니다.내부 클래스는 스태틱할있습니다.내부 클래스를 정적으로 만드는 아이디어는 최상위 클래스의 개체를 인스턴스화하지 않고 내부 클래스의 개체를 인스턴스화하는 이점을 활용하는 것입니다.이는 최상위 클래스 내에서 정적 메서드 및 변수가 작동하는 것과 동일한 방법입니다.

따라서 Java는 내부 클래스레벨(네스트된 클래스)의 스태틱클래스를 지원합니다.

또한 Java는 최상위 클래스의 정적 클래스를 지원하지 않습니다.

Java의 정적 클래스를 기본적으로 이해하기 위한 질문에 대한 간단한 해결책이 되었으면 합니다.

내부 클래스가 아니면 static 키워드를 클래스와 함께 사용할 수 없습니다.정적 내부 클래스는 외부 클래스의 정적 멤버인 중첩된 클래스입니다.외부 클래스를 인스턴스화하지 않고 다른 정적 멤버를 사용하여 액세스할 수 있습니다.스태틱 멤버와 마찬가지로 스태틱네스트 클래스도 외부 클래스의 인스턴스 변수 및 메서드에 액세스할 수 없습니다.

public class Outer {
   static class Nested_Demo {
      public void my_method() {
          System.out.println("This is my nested class");
      }
   }
public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();
      nested.my_method();
   }
}

java에 static class 같은 게 있나요?

싱글톤은 정적 클래스입니다.아직 아무도 그들을 언급하지 않았다니 놀랍다.

public final class ClassSingleton { 

private static ClassSingleton INSTANCE;
private String info = "Initial info class";

private ClassSingleton() {        
}

public static ClassSingleton getInstance() {
    if(INSTANCE == null) {
        INSTANCE = new ClassSingleton();
    }
    
    return INSTANCE;
}

// getters and setters

public String getInfo(){
    return info;
  }
}

용도는 다음과 같습니다.

String infoFromSingleton = ClassSingleton.getInstance().getInfo()

싱글톤은 ArrayLists/List/Collection Classes 등을 저장하는 데 적합합니다.여러 영역에서 컬렉션을 수집, 업데이트, 복사하는 경우가 많고 이러한 컬렉션을 동기화해야 하는 경우.아니면 다대일.

Java에는 클래스와 관련된 정적 메서드(예: java.lang)가 있습니다.수학에는 정적 메서드만 있지만 클래스 자체는 정적 메서드가 아닙니다.

정적 메서드는 퍼블릭과 달리 클래스의 개체를 만들지 않고도 액세스할 수 있음을 의미합니다.

public class MyClass {
   // Static method
   static void myStaticMethod() {
      System.out.println("Static methods can be called without creating objects");
   }

  // Public method
  public void myPublicMethod() {
      System.out.println("Public methods must be called by creating objects");
   }

  // Main method
  public static void main(String[ ] args) {
      myStaticMethod(); // Call the static method
    // myPublicMethod(); This would output an error

    MyClass myObj = new MyClass(); // Create an object of MyClass
    myObj.myPublicMethod(); // Call the public method
  }
}

모두 좋은 답변이지만 java.util에 대한 참조는 보이지 않았습니다.정적 요인 방법으로 수 톤의 정적 내부 클래스를 사용하는 컬렉션입니다.그래서 같은 것을 더한다.

java.util에서 예를 추가하고 있습니다.정적 내부 클래스가 여러 개 있는 컬렉션.내부 클래스는 외부 클래스를 통해 액세스해야 하는 그룹 코드에 유용합니다.

/**
 * @serial include
 */
static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                             implements Set<E>, Serializable {
    private static final long serialVersionUID = -9215047833775013803L;

    UnmodifiableSet(Set<? extends E> s)     {super(s);}
    public boolean equals(Object o) {return o == this || c.equals(o);}
    public int hashCode()           {return c.hashCode();}
}

다음은 java.util의 스태틱팩터 메서드입니다.컬렉션 클래스

public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
    return new UnmodifiableSet<>(s);
}

언급URL : https://stackoverflow.com/questions/7486012/static-classes-in-java

반응형