没有可以访问Foo类型的封闭实例

我有以下代码:

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();是错误的。 new Thing(); 在范围内没有特定的Hello实例。

    如果您将其声明为静态类,那么它是一个“嵌套”类,它不需要特定的Hello实例。


    你已经将Thing类声明为一个非静态的内部类。 这意味着它必须与Hello类的一个实例关联。

    在你的代码中,你正试图从静态的上下文中创建一个Thing实例。 这正是编译器所抱怨的。

    有几种可能的解决方案。 要使用哪种解决方案取决于您想实现的目标。

  • 将Thing更改为静态嵌套类。

    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
    }
    
  • 将Hello Thing移出Hello类。

  • 有关嵌套/内部类的更多信息:嵌套类(The Java Tutorials)


    那么...很多好的答案,但我想增加更多。 对Java中的Inner类的简要介绍允许我们在另一个类中定义一个类,并且以这种方式嵌套类具有一定的优势:

  • 它可以隐藏(它增加了封装)来自其他类的类 - 尤其是当类仅被它包含的类使用时相关。 在这种情况下,外界不需要知道它。

  • 它可以使代码更易于维护,因为这些类在逻辑上围绕在需要的地方组合在一起。

  • 内部类可以访问其包含的类的实例变量和方法。

  • 我们主要有三种类型的Inner Classes

  • 本地内在
  • 静态内部类
  • 匿名内部类
  • 一些要记住的重要点

  • 我们需要类对象来访问它存在的Local Inner Class。
  • 静态内部类获得直接访问,就像它存在的同一类的任何其他静态方法一样。
  • 匿名内部类对于外部世界以及相同类(存在于其中)的其他方法或类都是不可见的,并且它在声明它的点上使用。
  • 让我们尝试实践上述概念

    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!");
        }
     }
    
    }
    

    我希望这对每个人都有帮助。 请参阅更多

    链接地址: http://www.djcxy.com/p/88885.html

    上一篇: No enclosing instance of type Foo is accessible

    下一篇: Is there a "word wrap" property for JLabel?