Java 为什么可以';t main函数实例化内部类?
Main函数确实实例化了它的非静态类,而在实例化内部类(非静态)时,java编译器会显示一个错误(如上面的代码)。为什么? 编辑:我不是问如何实例化内部类。我只想知道为什么Java 为什么可以';t main函数实例化内部类?,java,Java,Main函数确实实例化了它的非静态类,而在实例化内部类(非静态)时,java编译器会显示一个错误(如上面的代码)。为什么? 编辑:我不是问如何实例化内部类。我只想知道为什么main()没有实例化它的内部类,而下面的函数却实例化了它 class Outer{ int i = 60; class Inner{ void display(){ System.out.println(i); } } public
main()
没有实例化它的内部类,而下面的函数却实例化了它
class Outer{
int i = 60;
class Inner{
void display(){
System.out.println(i);
}
}
public static void main(String args[]){
Inner o = new Inner();
o.display();
}
}
外部
类也必须安装:
class Outer{
int i = 60;
void show(){
Inner k = new Inner();
k.display();
}
class Inner{
void display(){
System.out.println(i);
}
}
public static void main(String args[]){
Outer o = new Outer();
o.show();
}
}
您需要有父类的引用
Inner o = new Outer().new Inner();
您需要父类的(封闭)实例,因为子类实例本身不能存在,例如:
public static void main(String args[]){
Inner o = new Outer().new Inner();
o.display();
}
报告说:
InnerClass的实例只能存在于的实例中
OuterClass并可以直接访问its的方法和字段
封闭实例
要实例化内部类,必须首先实例化外部类
班级。然后,使用以下命令在外部对象中创建内部对象
语法:
OuterClass.InnerClass innerObject=outerObject.new InnerClass()
所以你可以试试:
Outer outer = new Outer();
Inner o = outer.new Inner();
o.display();
发件人:
静态嵌套类
与类方法和变量一样,静态嵌套类与其外部类相关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们
内部类
与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,因此它本身无法定义任何静态成员
因此,如果您希望能够实例化一个内部类,则需要有一个外部类的实例。在实例方法中,您不需要它,因为您总是引用“this”,因为类的静态方法和属性属于该类,而不属于该类的实例。因此,只能与类的其他静态方法和属性进行交互。您应该有一个
Outer
实例的引用,以便在其上创建internal
:new Outer()。new internal()
编辑:我不是问如何实例化内部类。。。答案与您的编辑完全相同:它创建了外部类的一个实例。您可以将嵌套类视为类似于方法的东西。如果没有包含该方法的类的对象,则不能使用非静态方法。内部类也是如此。要创建内部类的实例,您需要外部类的实例,如outerou=newouter();Inner in=ou.new Inner()代码>。原因是内部类可以访问其外部实例的所有成员(即使是私有成员),所以它必须知道应该能够访问哪个外部实例。调用ou.new internal()
时会发生这种情况,对外部
实例的引用保存在创建的内部
实例中。问题是在静态
上下文中没有此
。这一点在问题中也作了解释。您可能只阅读了已接受的答案,您还应该看看答案,如请参见编辑和解释。谢谢,您可以将内部类看作一个普通的非静态字段。它们不能从静态上下文中引用,因为它们被绑定到类的一个特定实例,所以当您实例化它们时,它们仅由您用来创建它们的外部类的特定实例可见。嵌套类与静态字段类似,它们与类对象关联,因此始终可以创建它们,因为类始终存在,并且任何人都可以访问它们内部类无法在静态上下文中实例化的另一个原因是,它们可以访问包含类的非静态字段,因此,从静态上下文中使用它们可能会导致不一致(即NullPointerException,…)
Inner o = new Outer().new Inner();