有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需要思考的不是怎么使用多重继承,而是您的设计是否存在问题.但有时候我们确实是需要实现多重继承,而且现实生活中也真正地存在这样的情况,比如遗传:我们即继承了父亲的行为和特征也继承了母亲的行为和特征。可幸的是Java是非常和善和理解我们的,它提供了两种方式让我们曲折来实现多重继承:接口和内部类。
一、 接口
在介绍接口和抽象类的时候了解到子类只能继承一个父类,也就是说只能存在单一继承,但是却可以实现多个接口,这就为我们实现多重继承做了铺垫。
对于接口而已,有时候它所表现的不仅仅只是一个更纯粹的抽象类,接口是没有任何具体实现的,也就是说,没有任何与接口相关的存储,因此也就无法阻止多个接口的组合了。
|
interfaceCanFight {
voidfight();
}
interfaceCanSwim {
voidswim();
}
interfaceCanFly {
voidfly();
}
publicclassActionCharacter {
publicvoidfight(){
}
}
publicclassHeroextendsActionCharacterimplementsCanFight,CanFly,CanSwim{
publicvoidfly() {
}
publicvoidswim() {
}
/**
* 对于fight()方法,继承父类的,所以不需要显示声明
*/
}
|
二、内部类
上面使用接口实现多重继承是一种比较可行和普遍的方式,在介绍内部类的时候谈到内部类使的多继承的实现变得更加完美了,同时也明确了如果父类为抽象类或者具体类,那么我就仅能通过内部类来实现多重继承了。如何利用内部类实现多重继承,请看下面实例:儿子是如何利用多重继承来继承父亲和母亲的优良基因。
首先是父亲Father和母亲Mother:
|
publicclassFather {
publicintstrong(){
return9;
}
}
publicclassMother {
publicintkind(){
return8;
}
}
|
重头戏在这里,儿子类Son:
|
publicclassSon {
/**
* 内部类继承Father类
*/
classFather_1extendsFather{
publicintstrong(){
returnsuper.strong() +1;
}
}
classMother_1extends Mother{
publicintkind(){
returnsuper.kind() -2;
}
}
publicintgetStrong(){
returnnewFather_1().strong();
}
publicintgetKind(){
returnnewMother_1().kind();
}
}
|
测试程序:
|
publicclassTest1 {
publicstaticvoidmain(String[] args) {
Son son =newSon();
System.out.println(“Son 的Strong:”+ son.getStrong());
System.out.println(“Son 的kind:”+ son.getKind());
}
}
—————————————-
Output:
Son 的Strong:10
Son 的kind:6
|
儿子继承了父亲,变得比父亲更加强壮,同时也继承了母亲,只不过温柔指数下降了。这里定义了两个内部类,他们分别继承父亲Father类、母亲类Mother类,且都可以非常自然地获取各自父类的行为,这是内部类一个重要的特性:内部类可以继承一个与外部类无关的类,保证了内部类的独立性,正是基于这一点,多重继承才会成为可能。
文档来源:http://www.importnew.com/20768.html
转载请注明来源网站:blog.ytso.com谢谢!
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/14859.html