当前位置: 首页 > 面试题库 >

Java中的静态嵌套类,为什么?

咸高谊
2023-03-14
问题内容

我正在查看Java代码LinkedList并注意到它使用了静态嵌套类Entry

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

使用静态嵌套类而不是普通内部类的原因是什么?

我能想到的唯一原因是Entry不能访问实例变量,因此从OOP的角度来看,它具有更好的封装性。

但是我认为可能还有其他原因,也许是性能。可能是什么?

注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/tutorial/java/javaOO/nested.html


问题答案:

你链接到的Sun页面在两者之间有一些关键区别:

嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。静态嵌套类无权访问封闭类的其他成员。

注意:静态嵌套类与它的外部类(和其他类)的实例成员进行交互,就像其他任何顶级类一样。实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。

不需要LinkedList.Entry是顶级类,因为它仅被使用LinkedList(有些其他接口也具有名为的静态嵌套类Entry,例如Map.Entry-相同的概念)。而且由于它不需要访问LinkedList的成员,因此将它设为静态是有意义的-这是一种更为简洁的方法。

正如Jon Skeet所指出的那样,我认为如果你使用嵌套类是一个更好的主意,那就是从它的静态开始,然后根据你的使用情况确定它是否真的需要是非静态的。



 类似资料:
  • 问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。

  • 问题内容: 我刚刚在我们的代码库中找到了一个静态嵌套接口。 我以前从未见过。原始开发人员遥不可及。因此,我不得不问: 静态接口背后的语义是什么?如果我删除,会发生什么变化static?为什么有人会这样做? 问题答案: 上例中的static关键字是多余的(嵌套接口自动为“ static”),可以删除而不会影响语义;我建议将其删除。接口方法上的“公共”和接口字段上的“公共最终”也是如此-修饰符是多余的

  • 问题内容: 我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。 我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法的含义- 为什么调用内部构造函数? 我只看到一个用于调用超类构造函数和调用重写方法的超类版本的纯文本,但从未使用过这种形式。 问题答案: 这称为“合格的超类构造函

  • 我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下: 如果删除,则在上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。 为什么当返回时,编译器会抱怨方法不在中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?

  • 问题内容: 这节课: 无法编译: 因为( 根据Java语言规范 Java SE 8 Edition 的 第 8.1.4节“超类和子类”)类将直接依赖于“本身”,因为类直接取决于“ [其] 或子句[…中提到的”的任何类型。 ]作为超类或超接口名称的完全限定形式的限定符。” 但是我真的不明白这里的动机。什么是有问题的依赖关系?是否只是为了与非语言环境保持一致(因此最终将以其自身的词汇包围实例)? 问题

  • 但是为什么在下面的情景中允许静态嵌套类对象的实例化呢? 为什么我们可以创建内部类的对象,如果它被标记为静态的?