"No closing instance of type Foo is accessible" 오류의 원인 및 수정 방법
다음 코드가 있습니다.
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
아무것도 안하지만, 안녕, 월드 프로그램은 그것 없이도 잘 컴파일 할 수 있어.오직 내가 정한 수업들만이 나에게 낙제점을 준다.
이해하다No enclosing instance of type Hello is accessible."
새로운 것을 창조하는 라인에서.'이것'은 다음과 같습니다.
- 시스템 레벨의 문제가 있다(DrJava 또는 Java 설치 중 하나) 또는
- 자바에서 작업 프로그램을 구축하는 방법에 대한 기본적인 이해가 있습니다.
좋은 생각 있어요?
static class Thing
이치노
상태로는,에게는 금금 as as as as as as as as as as asThing
클래스로서 ( .Hello
), (하지 않거나 참조하지 입니다.new Thing();
한 별한 a a a가 없는 Hello
instance in scope.
하면 ' ' 클래스는 하지 않습니다.Hello
★★★★★★ 。
Thing
즉, ,, 이, 이, 이, of, of의 .Hello
를 누릅니다
「」, 「」의 .Thing
참조할 수 있습니다.그것이 컴파일러가 불평하고 있는 것입니다.
몇 가지 해결책이 있습니다.어떤 솔루션을 사용할지는 무엇을 달성하고 싶은지에 따라 달라집니다.
★★
Thing
of에서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
예를 들어 다음과 같습니다.
Thing t = new Thing(31);
될 수 . 명백하게 될 수 없기 때문입니다. 왜냐하면 명백한 증거가 없기 때문입니다.enormous
테스트하는 값입니다. " "h
Hello
는 이 기능을 합니다.h.enormous
추가:
...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...
'우리'는 '우리'가 때문입니다.Thing
Hello
.
중첩/내부 클래스에 대한 자세한 내용은 다음을 참조하십시오.중첩된 클래스(Java 튜토리얼)
음... 좋은 답변이 많긴 한데 더 추가하고 싶어요.Java-Java에서 내부 클래스를 간략히 살펴보면 다른 클래스 내에서 클래스를 정의할 수 있으며 이러한 방식으로 클래스를 중첩할 수 있다는 몇 가지 이점이 있습니다.
클래스를 다른 클래스에서 숨길 수 있습니다(캡슐화 증가). 특히 클래스가 포함된 클래스에서만 사용되는 경우에 적합합니다.이 경우 외부에 알릴 필요가 없습니다.
클래스가 논리적으로 필요한 곳에 그룹화되어 있기 때문에 코드의 유지보수가 용이해집니다.
inner 클래스는 포함하는 클래스의 인스턴스 변수 및 메서드에 액세스할 수 있습니다.
주로 3가지 타입의 제품이 있습니다.
- 로컬 내부
- 스태틱 내부 클래스
- 익명 내부 클래스
기억해야 할 몇 가지 중요한 점
- 클래스 객체가 존재하는 로컬 내부 클래스에 액세스하려면 클래스 객체가 필요합니다.
- 스태틱 내부 클래스는 해당 클래스가 존재하는 같은 클래스의 다른 스태틱메서드와 동일하게 직접 액세스 됩니다.
- 익명 내부 클래스는 외부 세계뿐만 아니라 동일한 클래스의 다른 메서드 또는 클래스(존재하는 클래스)에도 표시되지 않으며 선언된 지점에서 사용됩니다.
위의 개념을 실제로 보도록 합시다.
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
internal class는 internal class 입니다.Hello
. 의Hello
붙일 수 있는 거죠.접속이 없는 스태틱네스트 클래스로 변경하면 가장 쉽게 수정할 수 있습니다.
static class Thing
다음의 간단한 예시로 그것을 이해합시다.이것은 이것이 NON-STATIC INSER CLASS이기 때문에 발생합니다.외부 클래스의 인스턴스가 필요합니다.
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");
}
}
}
Java 14 이전 클래스에 액세스하려면 static 키워드를 추가해야 합니다.Thing
참조할 수 있습니다.
class Hello {
static class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Java 14+ Java 14부터는 암묵적으로 정적인 내부 레코드 클래스를 사용할 수 있습니다.다음과 같이 됩니다.
class Hello {
record Thing(int size) { }
public static void main(String[] args) {
Thing thing1 = new Thing(0);
System.out.println("Hello, World!");
}
}
INSER 클래스 Thing을 스태틱으로 선언하면 문제없이 동작합니다.
저는 이너 클래스 도그를 {class Dog { only로 선언했을 때 같은 문제가 있었던 것으로 기억합니다.저도 당신과 같은 문제를 받았습니다.두 가지 솔루션이 있었습니다.
1- 내부 클래스 도그를 정적이라고 선언합니다.또는
2- 내부 클래스 도그를 새 클래스로 이동합니다.
다음은 예를 제시하겠습니다.
퍼블릭 클래스 ReturnDemo {
public static void main(String[] args) {
int z = ReturnDemo.calculate(10, 12);
System.out.println("z = " + z);
ReturnDemo.Dog dog = new Dog("Bosh", " Doggy");
System.out.println( dog.getDog());
}
public static int calculate (int x, int y) {
return x + y;
}
public void print( ) {
System.out.println("void method");
return;
}
public String getString() {
return "Retrun String type value";
}
static class Dog {
private String breed;
private String name;
public Dog(String breed, String name) {
super();
this.breed = breed;
this.name = name;
}
public Dog getDog() {
// return Dog type;
return this;
}
public String toString() {
return "breed" + breed.concat("name: " + name);
}
}
}
이것을 사용해 보세요: (메인 대신 헬로라고도 할 수 있습니다.)
class Thing {
public int size;
Thing() {
size = 0;
}
}
class Main {
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
이 배경에는 static void main(String[] args) 메서드를 포함하는 별도의 클래스를 만들어야 합니다.요약: 개체를 만드는 클래스와 개체 생성을 포함하는 다른 클래스(이전 클래스 이외)가 있어야 합니다.Main이라고 부르면 Main.java라는 파일이 있어야 합니다.Hello 라고 하는 경우는, 파일명을 Hello.java 로 할 필요가 있습니다.
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
PlayGround obj = new PlayGround();
Thing obj2 = obj.new Thing();
System.out.println("Hello, World!");
}
}
저 같은 경우에는 '}'이 하나 더 추가되었기 때문입니다.
언급URL : https://stackoverflow.com/questions/9560600/what-causes-error-no-enclosing-instance-of-type-foo-is-accessible-and-how-do-i
'programing' 카테고리의 다른 글
C에서 함수 프로토타입을 선언해야 합니까? (0) | 2022.08.23 |
---|---|
Vuex 저장소에서 초기 로컬 데이터를 설정하여 "변환 안 함" 오류가 발생함 (0) | 2022.08.23 |
C 및 C++ 함수에 다차원 배열을 전달하는 방법 (0) | 2022.08.16 |
Axios 핸들러 내에서 Vuex 저장소를 사용할 수 없습니다. (0) | 2022.08.16 |
strcpy 대신 strncpy를 사용해야 하는 이유는 무엇입니까? (0) | 2022.08.16 |