1

当我们尝试在 java 中实例化一个内部类(又名:非静态嵌套类)时,假设我们在两种情况下这样做:

1.在外部类的同一文件中的主要方法中,我们有两个选项:(例如:)

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();
  }
}
  1. 在另一个类(比如不同的文件)中,我们只有第二个选项,使用第一个选项需要我们(当然)导入 InnerClass..,

问:你能解释一下为什么我们在第一种情况下(同一个文件中的 main 方法)有第一个选项(不需要任何导入)?

编辑:

我想第一个问题的答案与内部类的核心思想有什么关系。但是然后+Q:

问:内部类不是外部类的常规成员吗,所以如果内部类没有声明为静态(静态嵌套类),那么我认为它是非静态成员,因此是它的引用类型,那为什么我们能够在静态上下文(静态方法)中声明它吗?

4

2 回答 2

2

简单地说,这是因为当您从存在内部类的类之外的主方法中实例化内部类时,Java 编译器无法知道该内部类位于哪个类中。因此你必须做

Test1.InnerClass innerClassObject = ...

代替

InnerClass innerClassObject = ...
于 2017-03-25T15:18:04.500 回答
0

InnerClass 的实例只能存在于 OuterClass 的实例中,并且可以直接访问其封闭实例的方法和字段。

要实例化内部类,您必须先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

来自 Oracle 文档:https ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

于 2017-03-25T15:35:45.053 回答