Java 内部类实现“多重继承”
java里面是没有多重继承的,因为永远是单根继承。但是通过内部类的继承,保存一个内部类的对象,可以模拟出一种多重继承。
匿名内部类实现
假如这里有一位蔡同学,他喜欢唱和跳,但唱和跳是两个抽象类,他又想实现类似多重继承的功能:
abstract class sing{
abstract void singASong();
}
abstract class dance{
abstract void danceADance();
}
class cai extends sing{
@Override
void singASong(){
System.out.println("i'm singing");
}
dance d = new dance(){//匿名内部类继承了dance抽象类
@Override
void danceADance() {
System.out.println("i'm dancing");
}
};
}
public class multi {
public static void main(String[] args){
cai c = new cai();
c.singASong();
c.d.danceADance();
}
}/*output:
i'm singing
i'm dancing
*/
- 模拟出来的实例有一定缺陷,想用
sing
引用来接只能用c
,想用dance
引用来接则只能用c.d
。 - 通过保持继承另一个抽象类的匿名内部类对象的引用,来实现多重继承,缺点是必须通过
c.d
间接调用另一个抽象类的方法。
同一种成员内部类,不同实例
abstract class sing{
abstract void singASong();
}
abstract class dance{
abstract void danceADance();
}
class cai extends sing{
@Override
void singASong(){
System.out.println("i'm singing");
}
class dancer extends dance{
int count = 0;
@Override
void danceADance() {
System.out.println("i'm dancing");
System.out.println(this +"已经跳了"+ (++count) +"次");
}
}
dance d1 = new dancer();
dance d2 = new dancer();
}
public class multi {
public static void main(String[] args){
cai c = new cai();
c.singASong();
c.d1.danceADance();
c.d1.danceADance();
}
}/*output:
i'm singing
i'm dancing
cai$dancer@45ee12a7已经跳了1次
i'm dancing
cai$dancer@45ee12a7已经跳了2次
*/
- 定义了成员内部类,以方便创建多个实例。从同一个类创建多个实例,但各个实例能保持各自的状态。
- 新增了成员count,它保持了自己实例的状态。
不同的方式实现同一个接口
abstract class sing{
abstract void singASong();
}
abstract class dance{
abstract void danceADance();
}
class cai extends sing{
@Override
void singASong(){
System.out.println("i'm singing");
}
class dancerWild extends dance{
int count = 0;
@Override
void danceADance() {
System.out.println("i'm dancing wild");
System.out.println(this +"已经跳了"+ (++count) +"次");
}
}
class dancerGentle extends dance{
int count = 0;
@Override
void danceADance() {
System.out.println("i'm dancing gentle");
System.out.println(this +"已经跳了"+ (++count) +"次");
}
}
dance d1 = new dancerWild();
dance d2 = new dancerGentle();
}
public class multi {
public static void main(String[] args){
cai c = new cai();
c.singASong();
c.d1.danceADance();
c.d2.danceADance();
}
}/*output:
i'm singing
i'm dancing wild
cai$dancerWild@45ee12a7已经跳了1次
i'm dancing gentle
cai$dancerGentle@330bedb4已经跳了1次
*/