我有以下代码:
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."
在创造新事物的线上。我猜是:
有任何想法吗?
static class Thing
将使您的计划有效。
事实上,你有Thing
作为一个内部类,它(根据定义)与Hello
的特定实例相关联(即使它从未使用或引用它),这意味着如果没有一个new Thing();
,这是一个错误特别是Hello
范围内的实例。
如果你将它声明为静态类,那么它就是一个“嵌套”类,它不需要特定的Hello
实例。
您已将类Thing
声明为非静态内部类。这意味着它必须与Hello
类的实例相关联。
在您的代码中,您尝试从静态上下文创建Thing
的实例。这就是编译器所抱怨的。
有一些可能的解决方案。使用哪种解决方案取决于您想要实现的目标。
Thing
移出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
值来测试31对它。 h
外部类的实例Hello
是提供此h.enormous
值所必需的:
...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...
因为它不意味着Thing
,如果它没有Hello
。
有关嵌套/内部类的更多信息:Nested Classes (The Java Tutorials)
嗯...这么多好的答案,但我想在它上面添加更多。简要介绍Java-Java中的Inner类允许我们在另一个类中定义一个类,并且能够以这种方式嵌套类具有以下优点:
我们主要有三种类型的Inner Classes
一些重要的要点需要记住
让我们试着看看上面的概念_
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!");
}
}
}
我希望这对每个人都有帮助。请refer for more
Thing
是一个inner class,与Hello
的实例自动连接。您收到编译错误,因为没有Hello
实例可以附加到它。您可以通过将其更改为没有连接的static nested class来最轻松地修复它:
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");
}
}
}