developer tip

자바의 정적 클래스

copycodes 2020. 9. 28. 09:18
반응형

자바의 정적 클래스


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가 최상위 클래스 선언 static허용 하면 Math 클래스는 실제로 정적입니다.


음, 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에 정적 중첩 클래스가 있습니다. 중첩 된 클래스를 static으로 선언하면 해당 클래스가 속한 외부 클래스를 인스턴스화하지 않고도 인스턴스화 할 수있는 독립형 클래스가됩니다.

예:

public class A
{

 public static class B
 {
 }
}

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

B b = new B();

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

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

a 내부의 멤버 classstatic.. 로 선언되면 어떻게됩니까? 해당 멤버는 class. 따라서 외부 클래스 (최상위 클래스)를 만드는 것은 static의미가 없습니다. 따라서 허용되지 않습니다.

But you can set inner classes as static (As it is a member of the top level class). Then that class can be accessed without instantiating the top level class. Consider the following example.

public class A {
    public static class B {

    }
}

Now, inside a different class C, class B can be accessed without making an instance of class A.

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

static classes can have non-static members too. Only the class gets static.

But if the static keyword is removed from class B, it cannot be accessed directly without making an instance of A.

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

But we cannot have static members inside a non-static inner class.


Seeing as this is the top result on Google for "static class java" and the best answer isn't here I figured I'd add it. I'm interpreting OP's question as concerning static classes in C#, which are known as singletons in the Java world. For those unaware, in C# the "static" keyword can be applied to a class declaration which means the resulting class can never be instantiated.

Excerpt from "Effective Java - Second Edition" by Joshua Bloch (widely considered to be one of the best Java style guides available):

As of release 1.5, there is a third approach to implementing singletons. Simply make an enum type with one element:

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

This approach is functionally equivalent to the public field approach, except that it is more concise, provides the serialization machinery for free , and provides an ironclad guarantee against multiple instantiation, even in the face of sophisticated serialization or reflection attacks. While this approach has yet to be widely adopted, a single-element enum type is the best way to implement a singleton. (emphasis author's)

Bloch, Joshua (2008-05-08). Effective Java (Java Series) (p. 18). Pearson Education.

I think the implementation and justification are pretty self explanatory.


Can a class be static in Java ?

The answer is YES, we can have static class in java. In java, we have static instance variables as well as static methods and also static block. Classes can also be made static in Java.

In java, we can’t make Top-level (outer) class static. Only nested classes can be static.

static nested class vs non-static nested class

1) Nested static class doesn’t need a reference of Outer class, but Non-static nested class or Inner class requires Outer class reference.

2) Inner class(or non-static nested class) can access both static and non-static members of Outer class. A static class cannot access non-static members of the Outer class. It can access only static members of Outer class.

see here: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


Outer classes cannot be static, but nested/inner classes can be. That basically helps you to use the nested/inner class without creating an instance of the outer class.


In simple terms, Java supports the declaration of a class to be static only for the inner classes but not for the top level classes.

top level classes: A java project can contain more than one top level classes in each java source file, one of the classes being named after the file name. There are only three options or keywords allowed in front of the top level classes, public, abstract and final.

Inner classes: classes that are inside of a top level class are called inner classes, which is basically the concept of nested classes. Inner classes can be static. The idea making the inner classes static, is to take the advantage of instantiating the objects of inner classes without instantiating the object of the top level class. This is exactly the same way as the static methods and variables work inside of a top level class.

Hence Java Supports Static Classes at Inner Class Level (in nested classes)

And Java Does Not Support Static Classes at Top Level Classes.

I hope this gives a simpler solution to the question for basic understanding of the static classes in Java.


You cannot use the static keyword with a class unless it is an inner class. A static inner class is a nested class which is a static member of the outer class. It can be accessed without instantiating the outer class, using other static members. Just like static members, a static nested class does not have access to the instance variables and methods of the outer class.

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

A static method means that it can be accessed without creating an object of the class, unlike public:

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 has static methods that are associated with classes (e.g. java.lang.Math has only static methods), but the class itself is not static.


Using static classes is simply great for grouping purposes. Because Java allows us to group classes that are useful to each other, we group them just to keep them together under a single keyword static.

Java supports nested classes and they can be static. These static classes are also called static nested classes. Java static nested class can access only static members of the outer class. Static nested class behaves similar to top-level class and is nested for only packaging convenience.

Let’s look at the example of java static class and see how it can be used in java program.

public class OuterClass {

private static String name = "Mohammad";

// static nested class
static class StaticNestedClass {
    private int a;

    public int getA() {
        return this.a;
    }

    public String getName() {
        return name;
    }
  }
}

Now let’s see how to instantiate and use static nested class.

public class StaticNestedClassTest {

public static void main(String[] args) {

    //creating instance of static nested class
    OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();

    //accessing outer class static member
    System.out.println(nested.getName());    // Printing "Mohammad"
    }
}

See more details here :

Understanding Static Class in Java | Java Nested Class

Static class in Java

Java Static Class: A step further in your Java programming journey

Java Nested and Inner Class

참고URL : https://stackoverflow.com/questions/7486012/static-classes-in-java

반응형