static class
자바 와 같은 것이 있습니까?
그러한 클래스의 의미는 무엇입니까? 정적 클래스의 모든 메소드 static
도 필요 합니까?
다른 방법으로 클래스에 모든 정적 메소드가 포함되어 있으면 클래스도 정적이어야합니까?
정적 클래스는 무엇입니까?
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 클래스는 정적 일 수 있습니다.
Foo
만 있는 클래스 static
는 다음과 동일하지 않습니다.static class Foo
Java에는 "정적 중첩 클래스"가 있지만 C #의 정적 클래스와 동일하지는 않습니다. 정적 중첩 클래스는 암시 적으로 외부 클래스의 인스턴스에 대한 참조가없는 클래스입니다.
정적 중첩 클래스는 인스턴스 메소드와 정적 메소드를 가질 수 있습니다.
Java에는 최상위 정적 클래스와 같은 것이 없습니다.
static
. 그것들을 구성하기 위해 다른 것에 대한 참조가 필요하지 않다는 점에서 암시 적으로 정적입니다. 개인적으로 정적 / 비 정적 용어가 중첩 클래스에 약간 이상하다는 것을 알았습니다 ... 행동이 무엇인지 이야기하는 것이 더 간단하다고 생각합니다.
정적 중첩 클래스가 있으며,이 [정적 중첩] 클래스는 인스턴스화되기 위해 둘러싸는 클래스의 인스턴스가 필요하지 않습니다.
이 클래스 [정적 중첩 클래스]는 포함 클래스의 정적 멤버에만 액세스 할 수 있습니다 (클로징 클래스의 인스턴스에 대한 참조가 없기 때문에 ...]
코드 샘플 :
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 B
static으로 선언 되었으므로 다음과 같이 명시 적으로 인스턴스화 할 수 있습니다.
B b = new B();
class B
독립형으로 만들기 위해 정적으로 선언되지 않은 경우 인스턴스 객체 호출은 다음과 같습니다.
A a= new A();
B b = a.new B();
B b = new B();
클래스 A
자체 에서 인스턴스화하려는 경우 와 같이 비 정적 클래스를 정기적으로 인스턴스화 할 수 있습니다 .
내부 구성원 class
이 static
.. 로 선언되면 어떻게 되나요? 해당 멤버는을 인스턴스화하지 않고 액세스 할 수 있습니다 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
.
static
Java에서는 하나의 의미 만 있습니다. 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
외부 클래스는 정적 일 수 없지만 중첩 / 내부 클래스는 정적 일 수 있습니다. 기본적으로 외부 클래스의 인스턴스를 만들지 않고 중첩 / 내부 클래스를 사용하는 데 도움이됩니다.
간단히 말해서, Java는 클래스 선언을 내부 클래스에 대해서만 정적이지만 최상위 클래스에 대해서는 정적이 아닌 것으로 선언합니다.
최상위 클래스 : Java 프로젝트는 각 Java 소스 파일에 둘 이상의 최상위 클래스를 포함 할 수 있으며 클래스 중 하나는 파일 이름을 따라 이름이 지정됩니다. 최상위 클래스 앞에는 public, abstract 및 final의 세 가지 옵션 또는 키워드 만 허용됩니다.
내부 클래스 : 최상위 클래스 내부에있는 클래스를 내부 클래스라고하며 기본적으로 중첩 클래스의 개념입니다. 내부 클래스는 정적 일 수 있습니다 . 내부 클래스를 정적으로 만드는 아이디어는 최상위 클래스의 개체를 인스턴스화하지 않고 내부 클래스의 개체를 인스턴스화하는 이점을 이용하는 것입니다. 이것은 정적 메소드 및 변수가 최상위 클래스 내에서 작동하는 것과 정확히 같은 방식입니다.
따라서 Java는 내부 클래스 수준 (중첩 클래스)에서 정적 클래스를 지원합니다.
그리고 Java는 최상위 클래스에서 정적 클래스를 지원하지 않습니다.
이것이 Java의 정적 클래스에 대한 기본적인 이해에 대한 질문에 대한 더 간단한 해결책을 제공하기를 바랍니다.
정적 키워드는 내부 클래스가 아닌 한 클래스와 함께 사용할 수 없습니다. 정적 내부 클래스는 외부 클래스의 정적 멤버 인 중첩 클래스입니다. 다른 정적 멤버를 사용하여 외부 클래스를 인스턴스화하지 않고 액세스 할 수 있습니다. 정적 멤버와 마찬가지로 정적 중첩 클래스는 외부 클래스의 인스턴스 변수 및 메서드에 액세스 할 수 없습니다.
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();
}
}
정적 메소드는 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.util.Collections에 대한 참조를 보지 못했습니다. 그래서 같은 것을 추가합니다.
정적 내부 클래스가 여러 개인 java.util.Collections에서 예제 추가 내부 클래스는 외부 클래스를 통해 액세스해야하는 코드를 그룹화하는 데 유용합니다.
/**
* @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.Collections 클래스의 정적 요소 메소드입니다.
public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
return new UnmodifiableSet<>(s);
}