Java – 没有可以访问Footypes的封闭实例

我有以下代码:

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."在创build一个新的东西的线我猜或者:

  1. 我有系统级别的问题(DrJava或我的Java安装)或
  2. 我对如何在java中构build工作程序有一些基本的误解。

有任何想法吗?

static class Thing将使您的程序工作。

事实上,你已经将Thing作为一个内部类,它(根据定义)与Hello一个特定实例(即使它从不使用或引用它)相关联,这意味着说new Thing(); 在范围内没有特定的Hello实例。

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

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

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

有几个可能的解决scheme。 要使用哪种解决scheme取决于您想要达到的目标。

  • 改变是一个静态嵌套类。

     static class Thing 
  • 创build一个Hello实例,然后创build一个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类。

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

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

  1. 它可以隐藏(增加封装)从其他类的类 – 特别是相关的,如果该类只被它所包含的类使用。 在这种情况下,外部世界就不需要了解它。

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

  3. 内部类可以访问其包含的类的实例variables和方法。

我们主要有三种types的Inner Classes

  1. 本地的内心
  2. 静态内部类
  3. 匿名内部类

一些重要的要点要记住

  • 我们需要类对象来访问它存在的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!"); } } } 

我希望这将有助于每个人。 请参阅更多

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