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一个新的东西的线我猜或者:
- 我有系统级别的问题(DrJava或我的Java安装)或
- 我对如何在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类的简要介绍允许我们在另一个类中定义一个类,并且能够以这种方式嵌套类具有一定的优势:
-
它可以隐藏(增加封装)从其他类的类 – 特别是相关的,如果该类只被它所包含的类使用。 在这种情况下,外部世界就不需要了解它。
-
它可以使代码更易于维护,因为这些类在逻辑上围绕在需要的地方组合在一起。
-
内部类可以访问其包含的类的实例variables和方法。
我们主要有三种types的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!"); } } }
我希望这将有助于每个人。 请参阅更多
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"); } } }