programing

"No closing instance of type Foo is accessible" 오류의 원인 및 수정 방법

nicescript 2022. 8. 23. 23:15
반응형

"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."새로운 것을 창조하는 라인에서.'이것'은 다음과 같습니다.

  1. 시스템 레벨의 문제가 있다(DrJava 또는 Java 설치 중 하나) 또는
  2. 자바에서 작업 프로그램을 구축하는 방법에 대한 기본적인 이해가 있습니다.

좋은 생각 있어요?

static class Thing이치노

상태로는,에게는 금금 as as as as as as as as as as asThing 클래스로서 ( .Hello), (하지 않거나 참조하지 입니다.new Thing();한 별한 a a a가 없는 Helloinstance 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
    }
    

마지막 솔루션(비정적 네스트 클래스)은 다음과 같은 인스턴스가 있는 경우 필수입니다.ThingHello미가있있 있있있다다예를 들어 다음과 같습니다.

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테스트하는 값입니다. " "hHello는 이 기능을 합니다.h.enormous 추가:

...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...

'우리'는 '우리'가 때문입니다.ThingHello.

중첩/내부 클래스에 대한 자세한 내용은 다음을 참조하십시오.중첩된 클래스(Java 튜토리얼)

음... 좋은 답변이 많긴 한데 더 추가하고 싶어요.Java-Java에서 내부 클래스를 간략히 살펴보면 다른 클래스 내에서 클래스를 정의할 수 있으며 이러한 방식으로 클래스를 중첩할 수 있다는 몇 가지 이점이 있습니다.

  1. 클래스를 다른 클래스에서 숨길 수 있습니다(캡슐화 증가). 특히 클래스가 포함된 클래스에서만 사용되는 경우에 적합합니다.이 경우 외부에 알릴 필요가 없습니다.

  2. 클래스가 논리적으로 필요한 곳에 그룹화되어 있기 때문에 코드의 유지보수가 용이해집니다.

  3. inner 클래스는 포함하는 클래스의 인스턴스 변수 및 메서드에 액세스할 수 있습니다.

주로 3가지 타입의 제품이 있습니다.

  1. 로컬 내부
  2. 스태틱 내부 클래스
  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!");
    }
 }

}

이것이 모두에게 도움이 되기를 바랍니다.자세한 것은, 을 참조해 주세요.

Thinginternal 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

반응형