자바의 정적 클래스
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 내부의 멤버 class
가 static
.. 로 선언되면 어떻게됩니까? 해당 멤버는 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
Java Static Class: A step further in your Java programming journey
참고URL : https://stackoverflow.com/questions/7486012/static-classes-in-java
'developer tip' 카테고리의 다른 글
명령 줄에서 .bash_profile을 다시로드하는 방법은 무엇입니까? (0) | 2020.09.28 |
---|---|
Pandas를 사용하는 '대용량 데이터'워크 플로 (0) | 2020.09.28 |
푸시 후 자식 커밋 메시지 변경 (원격에서 아무도 가져 오지 않은 경우) (0) | 2020.09.28 |
C ++ 식별자에서 밑줄을 사용하는 규칙은 무엇입니까? (0) | 2020.09.28 |
NuGet을 사용하여 이전 버전의 패키지 다운로드 (0) | 2020.09.28 |