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