다음 코드가 있습니다.
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
나는 Thing
아무것도 안하지만 내 Hello, World 프로그램은 그것없이 잘 컴파일됩니다. 나에게 실패하는 것은 정의 된 클래스 일뿐입니다.
그리고 컴파일을 거부합니다. 나는 No enclosing instance of type Hello is accessible."
새로운 것을 만드는 줄에 도착 합니다. 나는 추측하고있다 :
- DrJava 또는 Java 설치에서 시스템 레벨 문제가 있거나
- Java로 작업 프로그램을 구성하는 방법에 대한 기본적인 오해가 있습니다.
어떤 아이디어?
답변
static class Thing
당신의 프로그램을 작동시킬 것입니다.
그러나 너희는있어 Thing
(정의)의 특정 인스턴스와 관련된 내부 클래스로 Hello
이 말을하는 것은 오류 의미합니다 (이 사용하지 않더라도 또는를 의미), new Thing();
특정하지 않고 Hello
인스턴스를 범위.
대신 정적 클래스로 선언하면 “중첩 된”클래스이므로 특정 Hello
인스턴스 가 필요하지 않습니다 .
답변
클래스 Thing
를 정적이 아닌 내부 클래스로 선언했습니다 . 즉, Hello
클래스 의 인스턴스와 연결되어야합니다 .
코드 Thing
에서 정적 컨텍스트에서 인스턴스를 만들려고합니다 . 그것이 컴파일러가 불평하는 것입니다.
몇 가지 가능한 해결책이 있습니다. 사용할 솔루션은 달성하려는 대상에 따라 다릅니다.
-
이동
Thing
의 밖으로Hello
클래스입니다. -
변경
Thing
할 수static
중첩 된 클래스입니다.static class Thing
-
의 인스턴스 를 만들기
Hello
전에 의 인스턴스 를 만듭니다Thing
.public static void main(String[] args) { Hello h = new Hello(); Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P }
의미있는 인스턴스에 의존하는 인스턴스 가있는 경우 마지막 솔루션 ( 비 정적 중첩 클래스)은 필수 입니다. 예를 들어 다음과 같은 경우Thing
Hello
public class Hello {
public int enormous;
public Hello(int n) {
enormous = n;
}
public class Thing {
public int size;
public Thing(int m) {
if (m > enormous)
size = enormous;
else
size = m;
}
}
...
}
다음 Thing
과 같이 class 객체를 생성하려는 모든 원시 시도 :
Thing t = new Thing(31);
enormous
31에 대해 테스트 할 명백한 가치 가 없기 때문에 문제가 될 수 있습니다 . 이 값 을 제공 h
하려면 Hello
외부 클래스 의 인스턴스 가 필요 h.enormous
합니다.
...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...
가없는 Thing
경우를 의미하지 않기 때문에 Hello
.
중첩 / 내부 클래스에 대한 자세한 내용 :
중첩 클래스 (Java 자습서)
답변
글쎄요 … 좋은 답변이 많지만 더 추가하고 싶습니다. Java-Inner의 내부 클래스를 간략하게 살펴보면 다른 클래스 내에 클래스를 정의 할 수 있으며 이러한 방식으로 클래스를 중첩 할 수 있다는 장점이 있습니다.
-
다른 클래스에서 클래스를 숨길 수 있습니다 (캡슐화를 증가시킵니다) -특히 클래스가 포함 된 클래스에서만 클래스를 사용하는 경우 관련이 있습니다. 이 경우 외부 세계가 그것에 대해 알 필요가 없습니다.
-
그것은 할 수 코드를보다 유지 보수가 필요할되는 경우 클래스가 논리적으로 주위에 그룹화되어있다.
-
내부 클래스는 포함하는 클래스의 인스턴스 변수 및 메소드에 액세스 할 수 있습니다.
우리는 주로 세 가지 유형이 있습니다 Inner Classes
- 로컬 이너
- 정적 내부 클래스
- 익명의 내부 클래스
기억해야 할 중요한 사항 중 일부
- 존재하는 로컬 내부 클래스에 액세스하려면 클래스 객체가 필요합니다.
- 정적 내부 클래스는 존재하는 동일한 클래스의 다른 정적 메소드와 동일하게 직접 액세스됩니다.
- 익명의 내부 클래스는 외부 세계뿐만 아니라 동일한 클래스의 다른 메소드 또는 클래스 (존재하는 클래스)에도 표시되지 않으며 선언 된 지점에서 사용됩니다.
위의 개념을 실제로 보려고 노력하자 _
public class MyInnerClass {
public static void main(String args[]) throws InterruptedException {
// direct access to inner class method
new MyInnerClass.StaticInnerClass().staticInnerClassMethod();
// static inner class reference object
StaticInnerClass staticInnerclass = new StaticInnerClass();
staticInnerclass.staticInnerClassMethod();
// access local inner class
LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass();
localInnerClass.localInnerClassMethod();
/*
* Pay attention to the opening curly braces and the fact that there's a
* semicolon at the very end, once the anonymous class is created:
*/
/*
AnonymousClass anonymousClass = new AnonymousClass() {
// your code goes here...
};*/
}
// static inner class
static class StaticInnerClass {
public void staticInnerClassMethod() {
System.out.println("Hay... from Static Inner class!");
}
}
// local inner class
class LocalInnerClass {
public void localInnerClassMethod() {
System.out.println("Hay... from local Inner class!");
}
}
}
이것이 모두에게 도움이되기를 바랍니다. 자세한 내용은 참조하십시오
답변
Thing
인 내부 클래스 의 인스턴스에 자동 연결 Hello
. Hello
첨부 할 인스턴스가 없기 때문에 컴파일 오류가 발생 합니다. 연결이없는 정적 중첩 클래스 로 변경하여 가장 쉽게 해결할 수 있습니다 .
static class Thing
답변
다음의 간단한 예를 통해 이해해 봅시다. 이것은 비 정적 내부 클래스이기 때문에 발생합니다. 외부 클래스의 인스턴스가 필요합니다.
public class PQ {
public static void main(String[] args) {
// create dog object here
Dog dog = new PQ().new Dog();
//OR
PQ pq = new PQ();
Dog dog1 = pq.new Dog();
}
abstract class Animal {
abstract void checkup();
}
class Dog extends Animal {
@Override
void checkup() {
System.out.println("Dog checkup");
}
}
class Cat extends Animal {
@Override
void checkup() {
System.out.println("Cat Checkup");
}
}
}