内部类实例

  • Q: 内部类为什么如此重要?

  • A: 内部类的存在使得我们可以在一个外部类里面实现多个相同的接口。


  • Q: 内部类为什么要把一个接口实现多次?

  • A: 例如GUI事件处理,设想有3个按钮,每个按钮有不同的用途,那么创建3个内部类,都实现同样的接口 ActionListener,这就意味着每一个类可以实现自己独有的 actionPerformed() 方法。


  • Q: 事件处理句柄是使用内部类的唯一原因吗?

  • A: 当然不,举这个例子是因为事件处理句柄很适合。每当你想要一个独立的类,但是它有时另外一个类的一部分,那么内部类就是最好的选择,某些时候也是唯一的选择。


  • Q: 还是有点懵,如果你想要内部类作为外部类的一部分,为什么优先使用单独的类?为什么不是优先把内部类的代码直接放在外部类的代码中呢?

  • A: 我刚刚给你举的例子是同一个接口有多个实现。但是当你没有使用接口的时候,你依然可以使用多个类,因为每个类代表不同的事物。


  • Q: 对了,我刚刚想到OO设计的思想是复用和可维护。有两个独立的类,两个都可以独立的修改和使用,这要比代码柔和到一起要好。但是对于内部类,最终还是要和一个真实的类打交道,对吧?外部的类才是唯一的可重用的,并且对其他每个人都是独立的内部类严格来说并不可重用。事实上,我非常多次听说它们是不可重用的-没用的。

说的对,内部类并不可重用,事实上某些时候根本不能重用,因为它和外部类的实例变量和方法紧密地关联在一起。但是它。。。


  • Q: 这完全证明我的观点了。如果他们不可重用,为什么要单独使用类呢?除了接口问题,对我而言他们仅仅是权宜之计。

  • A: 正如我所说,你的考虑IS-A 和多态。

因为外部类和内部类得通过不同的IS-A 测试。以多态GUI监听器为例,按钮监听器注册方法的的参数类型是什么?话句话说,传递给方法 addActionListener()的参数是什么(类还是接口类型)?


  • Q: 必须要传递一个监听器。通常是一个实现了特定的监听器的接口,在这种情况下是ActionListener。当然我们都知道这一点,你想证明什么?

  • A: 多态性,例如某个方法只接受一个特定的类型的参数,某个可以为 ActionListener 传递 IS-A 测试。但是,问题就来了,万一你的类就需要作为某种 IS-A 测试,那是一个类类型而不是接口?


  • Q: 为什么不让你的类直接继承你想要用的类呢?子类不就是这么用的吗?如果B是A的子类,那么所有需要A的地方,都可以用B来替代。这就是那一套pass-a-Dog-where-an-Animal-is-the-declared-type

  • A: 是的,的确如此!万一你需要传递 IS-A 测试给两个不同的类呢?多个类但是不在同一个继承级别里呢?


  • Q: 额,你真是。。。好吧,我大概明白了。可以实现多个接口,但是只能继承一个类。
原文地址:https://www.cnblogs.com/LinTeX9527/p/7346729.html