Java 在主方法中实例化内部类

Java 在主方法中实例化内部类,java,instantiation,inner-classes,main-method,Java,Instantiation,Inner Classes,Main Method,当我们尝试在java中实例化一个内部类(又称为非静态嵌套类)时,假设我们在两种情况下这样做: 1.在外部类的同一文件中的main方法中,我们有两个选项:(ex:) 或: 在另一个类(比如不同的文件)中,我们只有第二个选项,使用第一个选项需要我们(当然)导入InnerClass 问:你能解释一下为什么在第一种情况下(同一文件中的主方法),我们有第一种选择(不需要任何导入) 编辑: 我想第一个问题的答案是,与内部类的核心思想有什么关系。但是+Q: 问:内部类不是外部类的常规成员吗?因此,如果内部类不

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

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

或:

  • 在另一个类(比如不同的文件)中,我们只有第二个选项,使用第一个选项需要我们(当然)导入InnerClass
  • 问:你能解释一下为什么在第一种情况下(同一文件中的主方法),我们有第一种选择(不需要任何导入)

    编辑:

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


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

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

    Test1.InnerClass innerClassObject = ...
    
    而不是

    InnerClass innerClassObject = ...
    
    InnerClass的实例只能存在于的实例中 OuterClass并可以直接访问its的方法和字段 封闭实例

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

    OuterClass.InnerClass innerObject=outerObject.new InnerClass()


    从Oracle文档:

    为什么要在同一个文件中导入?同一个包中的任何东西都可以访问,而不必导入好问题。这只是一个有争议的假设,因为我不明白为什么在第一种情况下我们有两种选择。我的意思是内部类不是静态成员,但我们仍然在静态上下文(即静态主方法)中声明它+实例化。当您执行
    new InnerClass()
    时,它位于通过
    new Test1()
    检索的实例变量上。当您分配给
    Test1.InnerClass
    (与
    InnerClass
    ,因为这是我看到的唯一区别)时,实际上没有任何限制。如果需要,您甚至可以使用FQN:
    my.random.package.Test1.InnerClass var=/*etc*/所以我的意思是,引用变量和原始变量之间有什么区别…,而我认为如果内部类没有关键字static,那么它必须是非静态的…,那么我们怎么能把它的引用放在一个静态上下文中…,对不起,我的头在今天集中学习之后几乎不能工作了^^。伙计,您创建了一个实例<代码>新建
    在所有上下文中都是允许的。一旦创建了一个实例,并通过该实例进行调用,就不是从静态上下文调用,而是从该实例的上下文调用。想想看,如果你做不到这一点,你将永远无法运行任何程序。你不能使用类型作为赋值的目标。变量在哪里?被否决。考虑到原始问题代码也没有变量,我故意这么做。看来他假设了变量的存在。无论如何,我会编辑答案以消除所有歧义,@LewBloch我认为你应该重新考虑你的否决票。。我编辑了答案。^^我给了你大拇指^^..,别紧张,我只是忘了这么做。
    Test1.InnerClass innerClassObject = ...
    
    InnerClass innerClassObject = ...