我知道内部类必须是静态的,因为它将在公共类和内部类之间进行链接,并且将在创建公共类的所有时间创建内部类。 我的问题如何检查? 我的意思是编写一些简单的应用程序,并创建一些循环来创建对象,并在某些分析器中看到GC没有删除对象,我可以做一些类似的事情吗? 感谢。
答案 0 :(得分:8)
每次创建公共类都会创建内部类
如果您的意思是在创建外部类的实例时始终会创建内部类的实例,那不是真的。
您可以让外部实例没有附加的内部实例,并且相同的外部实例可以包含任意数量的附加内部实例(以及不同的内部类)。
它有点相反:当您创建(非静态)内部类的实例时,该实例将包含对其外部实例的引用(但这是对已存在对象的引用,而不是一个新的:你不能创建内部实例而不首先使用外部实例。
答案 1 :(得分:3)
这可以使用静态分析来完成。如果你正在使用Eclipse,请查看FindBugs插件,它可以检测到缺少static
内部类和一些其他有用的问题。
答案 2 :(得分:3)
内部类不必须是静态的。事实上,他们最常见的表现之一 - 匿名内部类 - 永远不会静态。
短语“static class”不会导致类在运行时创建 - 类加载时只能由类加载器“创建”一次。您的意思是每次创建外部类的实例时,都会创建内部类的实例。这一般也是 false (参见Thilo的回答)。
别担心 - 我误解了内部课程的方式与我第一次学习它们时完全一样!
非静态内部类将具有隐式(即,它是自动的,您不会声明它)对创建它的外部类的实例的引用。只要内部类的实例存在,这将阻止外部类的实例被GC,就像普通的Java引用一样。
静态内部类不会有这样的引用,因为它不是由外部实例创建的,而是由类加载器创建的。