为什么我们使用内部类?

Moh*_*oud 10 c# java inner-classes

我想问你为什么我们需要内部类以及为什么我们使用它们?
我知道如何使用内部类但我不知道为什么..

cle*_*tus 11

一些内部类是公开的(例如Map.Entry在Java中),但这是例外而不是常态.

内部类基本上是一个实现细节.

例如,Swing广泛使用事件侦听器的内部类.如果没有它们,您最终会用一堆您不需要查看的类来污染全局命名空间(这可能会使其目的更难确定).

基本上内部类是范围的一种形式.包访问会从包外部隐藏类.私有内部类将该类隐藏在该类之外.

Java中的内部类也可以替代缺少函数指针或方法委托(在C#中)或闭包.它们是将函数传递给另一个函数的手段.例如,在Executor课堂上你有:

void execute(Runnable r);
Run Code Online (Sandbox Code Playgroud)

所以你可以传入一个方法.在C/C++中可以通过以下方式实现:

void execute(void (*run)());
Run Code Online (Sandbox Code Playgroud)

是一个函数的指针.


cod*_*ict 5

维基百科的这篇文章可能会帮助你理解为什么我们需要一个内部类:

正常或顶级类的一个实例可以在它的存在本身。相比之下,内部类的实例不能在没有绑定到顶级类的情况下进行实例化。

让我们以四轮汽车的抽象概念为例。我们的车轮具有依赖于成为我们汽车的一部分的特定功能。这个概念并不将车轮表示为可能是车辆一部分的更一般形式的车轮。相反,它将它们表示为特定于这一点。我们可以使用内部类对这个概念进行建模,如下所示:

我们有顶级的汽车。Car 类的实例由 Wheel 类的四个实例组成。Wheel 的这个特定实现是特定于汽车的,因此代码没有对 Wheel 的一般概念进行建模,后者可以更好地表示为顶级类。因此,它在语义上与 Car 类相连,Wheel 的代码以某种方式与其外部类耦合。

内部类为我们提供了一种机制来准确地模拟这种连接。我们说我们的轮子类是 Car.Wheel,Car 是顶级类,Wheel 是内部类。

因此,内部类允许程序的某些部分面向对象,否则这些部分将不会被封装到类中。