内部类,是java中“哇”的特性之一。为什么说它是"哇“,因为每个刚接触的人都一定会说,”哇!“,怎么会有这种奇怪的东西。是的,这的确是一个令人会”哇"的东西,更重要的是,它并不是语言设计者在语言设计上的一个小花招,它的出现,是为了解决java中如何更好的实现多重继承但是又不会出现C++中出现的一些麻烦,而且也确实很好的解决了这个问题。
C++的多重继承是很难用的东西,因为很难保证它的继承行为不会带来问题,尤其是继承的层次越多,就越会出现问题。java作为C++的继承者,自然也在这方面做了非常大的努力,毕竟多重继承的作用依然是相当吸引人的,是不能随便放弃的。
再次强调,这篇文章并不是扫盲。因为我本人是新手,对java这门语言的认识相当浅陋,所以自然不能像大牛一样,能够将一些复杂的东西讲的通俗易懂,也不能将一些简单的东西讲的生动有趣,所以,我的文章,都是针对我在学习中遇到的具体问题而进行的具体分析,泛泛而谈之类的东西,抱歉,我还没那样的实力做到随手拈来。
那么,接下来就开始进入正题。
为什么需要内部类?
这个问题已经涉及到内部类的设计意义,前面已经讲过,内部类可以解决多重继承的问题,这里就再重新将这个问题用另一种说法解释:每个内部类都可以独立的继承自一个接口的实现,无论外围类是否已经继承了某个接口的实现,对于内部类都没有什么影响。什么意思呢?就是说,就算外围类已经是某个接口的实现或者继承某个接口的实现,内部类依然可以实现其他接口或者继承接口的实现类,但是彼此间又不会相互影响。这样的话,我们就可以在一个类中实现对于多个类的继承但是又不会像C++那样产生令人头疼的问题,多重继承借助内部类得到很好的解决,尤其是抽象类或者具体类的多重继承,就只能用内部类。提到继承的问题,自然就会衍生一个很显眼的问题,内部类能否被覆写?因为内部类在层次上和外围类的方法一样,既然方法可以被覆写,内部类呢?答案是不行。因为那已经不是覆写,而是导出类自己的内部类了,根本说不上什么覆写。所以,人们就会将内部类用在这样的情况,想要一个继承自某个类的类,实现某个接口同名的方法,因为会覆写,所以用内部类来独立实现该接口,就不会发生覆写。最好是能有一个方法将内部类向上转型为接口被其他类回调,而且获得此接口的引用的类,只能回调接口内的方法,不能使用外围类的其他成员。这样就能实现细节的完全隐藏了。