我知道如何创建一个内部类的实例。但我想知道为什么我们不能这样做:
class outerclass{
public static void main(String[] args){
innerclass in=new innerclass();
}
class innerclass{
}
}
如果我这样做,那么我得到以下错误:
No enclosing instance of type outerclass is accessible. Must qualify the allocation with an enclosing instance of type outerclass (e.g. x.new A() where x is an instance of outerclass).
为什么?
class Demo{
public static void main(String[] args){
System.out.println(innerclass.a);
}
static class innerclass{
static int a=1;
}
}
给出输出1.
看到这里,当把内部类设置为静态时,你可以很容易地在外部类中访问,为了创建一个嵌套类的实例,你必须用外部类名作为前缀来引用它,像这样:
Outer.Nested instance = new Outer.Nested();
非静态嵌套类(内部类)Java中的非静态嵌套类也称为内部类。内部类与封闭类的实例相关联。因此,必须首先创建封闭类的实例才能创建内部类的实例。下面是一个内部类定义的例子:
public class Outer {
public class Inner {
}
}
下面是如何创建Inner类的实例:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
请注意,为了创建内部类的实例,您是如何在外部类的引用后面加上new的。
非静态嵌套类(内部类)可以访问封闭类的字段,即使它们被声明为私有。下面是一个例子:
public class Outer {
private String text = "I am private!";
public class Inner {
public void printText() {
System.out.println(text);
}
}
}
您的innerclass
不是静态的。这意味着它必须有对外部类的引用。main
是静态的,没有隐式的外部类。
你必须让你的内部类是静态的(如上所述),或者从一个非静态的上下文中创建你的内部类,例如从一个非静态的方法。
。要么:
class outerclass{
void myMethod() {
innerclass in = new innerclass();
}
class innerclass{
}
}
或
class outerclass{
public static void main(String[] args){
innerclass in=new innerclass();
}
static class innerclass{
}
}
封装innerclass
的outerclass
没有被实例化,因此,直接调用innerclass
会抛出错误,因为没有outerclass
来附加innerclass
。
因此,正如前面的答案所建议的那样,将innerclass
设置为静态将解决这个问题,允许在不实例化的情况下访问innerclass
。
关于这个话题有很多现有的答案。谷歌一下就能看到