当我们尝试在java中实例化一个Inner类(又名:非静态嵌套类)时,假设我们在两种情况下这样做:
1.在外部类的同一文件中的main方法中,我们有两个选项:(例如:)
public class Test1
{
class InnerClass
{
}
public static void main(String[] args)
{
InnerClass inner = new Test1().new InnerClass();
}
}
或:
public class Test1
{
class InnerClass
{
}
public static void main(String[] args)
{
Test1.InnerClass inner = new Test1().new InnerClass();
}
}
问:你能解释一下为什么我们在第一种情况下(同一文件中的主要方法)有第一个选项(不需要任何导入)?
修改
我想第一个问题的答案是一些与内部类的核心思想有关的问题。但接着+ Q:
问:内部类不是外部类的常规成员,因此如果内部类未声明为静态(静态嵌套类),那么我认为它是非静态成员,因此它的引用类型,那么为什么我们能够在静态上下文中声明它(静态方法)?
答案 0 :(得分:2)
简单地说,这是因为当你从内部类所在的类之外的main方法实例化内部类时,Java编译器无法知道哪个类位于内部类中。因此你必须做
Test1.InnerClass innerClassObject = ...
而不是
InnerClass innerClassObject = ...
答案 1 :(得分:0)
InnerClass的一个实例只能存在于一个实例中 OuterClass并且可以直接访问其方法和字段 封闭实例。
要实例化内部类,必须首先实例化外部 类。然后,使用它在外部对象中创建内部对象 语法:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
来自Oracle文档:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html