【问题标题】:Instantiating an inner class within a main method在 main 方法中实例化内部类
【发布时间】:2017-03-25 23:41:01
【问题描述】:

当我们尝试在 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:

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

【问题讨论】:

  • 为什么要在同一个文件中导入?同一个包中的任何东西都可以在没有导入的情况下访问
  • 好问题。这只是一个有争议的假设,因为我不明白为什么在第一种情况下我们有两个选择。我的意思是内部类不是静态成员..,但我们仍然在静态上下文中声明它+实例化(即静态主方法)
  • 当您执行new InnerClass() 时,它位于通过new Test1() 检索的实例变量上。当您分配给Test1.InnerClass(而不是InnerClass,因为这是我看到的唯一区别)时,那里真的没有任何限制。如果需要,您甚至可以使用 FQN:my.random.package.Test1.InnerClass var = /* etc */;
  • 所以我的意思是,引用变量和原始变量之间有什么区别..,而我认为如果内部类没有关键字 static 它必须是非静态的..,所以我们怎么能把它的引用放在一个静态的上下文中..,对不起,今天密集学习后我的脑袋几乎不能运转了^^。
  • 老兄,您创建了一个实例。 new 在所有情况下都是允许的。一旦您创建了一个实例,并通过该实例调用,您就不是从静态上下文调用,而是从该实例的上下文调用。想想看,如果你做不到这一点,你将永远无法运行任何程序。

标签: java instantiation inner-classes main-method


【解决方案1】:

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

Test1.InnerClass innerClassObject = ...

而不是

InnerClass innerClassObject = ...

【讨论】:

  • 您不能使用类型作为分配的目标。变量在哪里?投反对票。
  • 考虑到原始问题代码也没有变量,我故意这样做。似乎他假设了变量的存在。
  • 无论如何我都会编辑答案以消除所有歧义,
  • @LewBloch 我认为你应该重新考虑你的否决票。我编辑了答案。
  • ^^ 我给你竖了大拇指^^..,放轻松,我只是忘了这样做。
【解决方案2】:

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

要实例化一个内部类,必须先实例化外部类 班级。然后,用这个在外部对象中创建内部对象 语法:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2012-09-23
    相关资源
    最近更新 更多