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次
*/