자바 : 정적 클래스와 내부 클래스
이 질문에는 이미 답변이 있습니다.
- Java 내부 클래스 및 정적 중첩 클래스 26 답변
정적 중첩 클래스와 비 정적 중첩 클래스의 차이점은 무엇입니까?
내부 클래스 는 정의상 정적 일 수 없으므로 "정적 클래스와 비 정적 중첩 클래스의 차이점은 무엇입니까?"
정적이 아닌 중첩 클래스는 중첩 된 클래스의 멤버에 대한 모든 액세스 권한을 갖습니다. 정적 중첩 클래스에는 중첩 인스턴스에 대한 참조가 없으므로 정적 중첩 클래스는 정적이 아닌 메소드를 호출하거나 중첩 된 클래스 인스턴스의 정적이 아닌 필드에 액세스 할 수 없습니다.
그러한 질문에 대한 지혜의 근원을 살펴 보겠습니다. Joshua Bloch의 Effective Java :
기술적으로 정적 내부 클래스는 없습니다. Effective Java 에 따르면 올바른 용어는 정적 중첩 클래스 입니다. 정적이 아닌 중첩 클래스는 실제로 익명 클래스 및 로컬 클래스와 함께 내부 클래스입니다.
그리고 지금 인용하자면 :
정적이 아닌 중첩 클래스 의 각 인스턴스는 포함하는 클래스 의 엔 클로징 인스턴스 와 암시 적으로 연결됩니다. 엔 클로징 인스턴스 에서 메서드를 호출 할 수 있습니다.
정적 중첩 클래스는 둘러싸는 인스턴스에 액세스 할 수 없습니다. 공간도 적게 사용합니다.
정적 내부 클래스와 비 정적 내부 클래스에는 두 가지 차이점이 있습니다.
멤버 필드 및 메소드를 선언하는 경우 비 정적 내부 클래스는 정적 필드 및 메소드를 가질 수 없습니다. 그러나 정적 내부 클래스의 경우 정적 및 비 정적 필드 및 메소드를 가질 수 있습니다.
정적이 아닌 내부 클래스의 인스턴스는 정의 된 외부 클래스의 객체 참조를 사용하여 작성되며, 이는 인스턴스를 둘러싸고 있음을 의미합니다. 그러나 정적 내부 클래스의 인스턴스는 외부 클래스의 참조없이 생성되므로 인스턴스를 둘러싸고 있지 않습니다.
이 예를 참조하십시오
class A
{
class B
{
// static int x; not allowed here
}
static class C
{
static int x; // allowed here
}
}
class Test
{
public static void main(String… str)
{
A a = new A();
// Non-Static Inner Class
// Requires enclosing instance
A.B obj1 = a.new B();
// Static Inner Class
// No need for reference of object to the outer class
A.C obj2 = new A.C();
}
}
정적 내부 클래스는 둘러싸는 클래스의 비 정적 멤버에 액세스 할 수 없습니다. 객체를 만들지 않고 값을 얻는 절차 스타일과 같은 클래스를 묶는 정적 멤버 (인스턴스 필드 및 메서드)에 직접 액세스 할 수 있습니다.
정적 내부 클래스는 정적 멤버와 비 정적 멤버를 모두 선언 할 수 있습니다. 정적 메소드는 기본 클래스의 정적 멤버에 액세스 할 수 있습니다. 그러나 정적이 아닌 내부 클래스 멤버에는 액세스 할 수 없습니다. 비 정적 내부 클래스의 멤버에 액세스하려면 비 정적 내부 클래스의 객체를 만들어야합니다.
비 정적 내부 클래스는 정적 필드 및 정적 메소드를 선언 할 수 없습니다. 정적 또는 최상위 유형으로 선언해야합니다. "정적 필드는 정적 또는 최상위 레벨 유형으로 만 선언됩니다"라고 말하면이 오류가 발생합니다.
정적이 아닌 내부 클래스는 가치를 얻는 절차 적 스타일로 둘러싸는 클래스의 정적 및 비 정적 멤버 모두에 액세스 할 수 있지만 정적 내부 클래스의 멤버에는 액세스 할 수 없습니다.
엔 클로징 클래스는 내부 클래스의 개체를 만들 때까지 내부 클래스의 멤버에 액세스 할 수 없습니다. 정적이 아닌 클래스의 멤버에 액세스하는 경우 기본 클래스는 정적이 아닌 내부 클래스의 오브젝트를 작성할 수 있습니다.
정적 내부 클래스의 멤버에 액세스하는 기본 클래스의 경우 두 가지 경우가 있습니다.
- 사례 1 : 정적 멤버의 경우 정적 내부 클래스의 클래스 이름을 사용할 수 있습니다
- 사례 2 : 비 정적 멤버의 경우 정적 내부 클래스의 인스턴스를 만들 수 있습니다.
중첩 클래스 토론 ...
차이점은 정적 인 중첩 클래스 선언을 둘러싸는 클래스 외부에서 인스턴스화 할 수 있다는 것입니다.
static 이 아닌 중첩 클래스 선언이 있으면 Java는 둘러싸는 클래스를 제외하고 인스턴스화 할 수 없습니다. 내부 클래스에서 생성 된 객체는 외부 클래스에서 생성 된 객체에 연결되므로 내부 클래스는 외부의 필드를 참조 할 수 있습니다.
그러나 정적 인 경우 링크가 존재하지 않고 외부 필드에 액세스 할 수 없으며 (다른 객체와 같은 일반 참조를 제외하고) 중첩 클래스를 자체적으로 인스턴스화 할 수 있습니다.
정적 내부 클래스 : 정적 및 비 정적 멤버를 선언 할 수 있지만 부모 클래스의 정적 멤버에만 액세스 할 수 있습니다.
비 정적 내부 클래스 : 비 정적 멤버 만 선언 할 수 있지만 부모 클래스의 정적 및 비 정적 멤버에 액세스 할 수 있습니다.
내부 클래스는 정적 일 수 없으므로 "정적 클래스와 비 정적 중첩 클래스의 차이점은 무엇입니까?"
u가 여기에서 말했듯이 내부 클래스는 정적 일 수 없습니다 ... 정적으로 주어진 아래 코드를 찾았습니다 .... 이유? 또는 맞습니다 ....
예, 정적 중첩 유형의 시맨틱에는 그렇게하지 못하게하는 것이 없습니다. 이 스 니펫은 잘 작동합니다.
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
이것은이 웹 사이트에 게시 된 코드입니다 ...
질문 ---> 정적 중첩 클래스를 여러 번 인스턴스화 할 수 있습니까?
대답은 --->
물론, 중첩 형식은 자체 인스턴스 제어 (예 : 개인 생성자, 단일 패턴 등)를 수행 할 수 있지만 중첩 형식이라는 사실과는 관련이 없습니다. 또한 중첩 형식이 정적 열거 형이면 전혀 인스턴스화 할 수 없습니다.
그러나 일반적으로 정적 중첩 형식은 여러 번 인스턴스화 할 수 있습니다.
기술적으로 정적 중첩 형식은 "내부"형식이 아닙니다.
정적 중첩 클래스는 다른 최상위 클래스와 마찬가지로 외부 클래스 및 다른 클래스의 인스턴스 멤버와 상호 작용합니다. 실제로 정적 중첩 클래스는 패키징 편의를 위해 다른 최상위 클래스에 중첩 된 최상위 클래스입니다.
참고 URL : https://stackoverflow.com/questions/1353309/java-static-vs-inner-class
'Programming' 카테고리의 다른 글
C #에서 스위치 문이 실패합니까? (0) | 2020.02.29 |
---|---|
제목없이 DialogFragment를 만드는 방법은 무엇입니까? (0) | 2020.02.29 |
SQL Server 테이블 열에서 문자열을 바꾸는 방법 (0) | 2020.02.29 |
NOT NIL을 사용하는 상태의 레일 (0) | 2020.02.29 |
ETag와 헤더 만료 (0) | 2020.02.29 |