java - 생성자 - 자바 클래스 예제




Java의 정적 클래스 (6)

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와 같은 수학 상수가 포함 된 수학 클래스이며 수학적 계산 만 제공합니다. 그러한 경우 인스턴스화를 요구하는 것은 불필요하고 혼란 스러울 수 있습니다. Java의 Math 클래스를 참조하십시오 . 최종이며 모든 구성원이 정적이라는 점에 유의하십시오. Java에서 최상위 클래스를 정적으로 선언 할 수 있다면 Math 클래스는 실제로 정적입니다.


Java에는 클래스와 연관된 정적 메서드가 있습니다 (예 : java.lang.Math에는 정적 메서드 만 있음). 그러나 클래스 자체는 정적이 아닙니다.


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

예:

public class A
{

 public static class B
 {
 }
}

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

B b = new B();

class B 가 독립형으로 선언되지 않은 경우 인스턴스 객체 호출은 다음과 같이 보입니다.

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

외부 클래스는 정적 일 수 없지만 중첩 된 / 내부 클래스가 될 수 있습니다. 기본적으로 외부 클래스의 인스턴스를 만들지 않고 중첩 된 / 내부 클래스를 사용하는 데 도움이됩니다.


정적 중첩 클래스가 있지만이 [정적 중첩] 클래스는 자체 인스턴스화를 위해 해당 클래스의 인스턴스가 필요하지 않습니다.

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

코드 샘플 :

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

class 내의 멤버가 static 이라고 선언되면 어떻게됩니까? 그 멤버는 class 를 인스턴스화하지 않고 액세스 할 수 있습니다. 그러므로 외부 클래스 (최상위 클래스)를 static 만드는 것은 의미가 없습니다. 그러므로 허용되지 않습니다.

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

public class A {
    public static class B {

    }
}

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

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 멤버를 staticnon-static 내부 클래스 안에 static 수 없습니다.





static-classes