Java 内部类实现“多重继承”

女爷i 2024-04-17 05:23 154阅读 0赞

java里面是没有多重继承的,因为永远是单根继承。但是通过内部类的继承,保存一个内部类的对象,可以模拟出一种多重继承。

匿名内部类实现

假如这里有一位蔡同学,他喜欢唱和跳,但唱和跳是两个抽象类,他又想实现类似多重继承的功能:

  1. abstract class sing{
  2. abstract void singASong();
  3. }
  4. abstract class dance{
  5. abstract void danceADance();
  6. }
  7. class cai extends sing{
  8. @Override
  9. void singASong(){
  10. System.out.println("i'm singing");
  11. }
  12. dance d = new dance(){ //匿名内部类继承了dance抽象类
  13. @Override
  14. void danceADance() {
  15. System.out.println("i'm dancing");
  16. }
  17. };
  18. }
  19. public class multi {
  20. public static void main(String[] args){
  21. cai c = new cai();
  22. c.singASong();
  23. c.d.danceADance();
  24. }
  25. }/*output: i'm singing i'm dancing */
  • 模拟出来的实例有一定缺陷,想用sing引用来接只能用c,想用dance引用来接则只能用c.d
  • 通过保持继承另一个抽象类的匿名内部类对象的引用,来实现多重继承,缺点是必须通过c.d间接调用另一个抽象类的方法。

同一种成员内部类,不同实例

  1. abstract class sing{
  2. abstract void singASong();
  3. }
  4. abstract class dance{
  5. abstract void danceADance();
  6. }
  7. class cai extends sing{
  8. @Override
  9. void singASong(){
  10. System.out.println("i'm singing");
  11. }
  12. class dancer extends dance{
  13. int count = 0;
  14. @Override
  15. void danceADance() {
  16. System.out.println("i'm dancing");
  17. System.out.println(this +"已经跳了"+ (++count) +"次");
  18. }
  19. }
  20. dance d1 = new dancer();
  21. dance d2 = new dancer();
  22. }
  23. public class multi {
  24. public static void main(String[] args){
  25. cai c = new cai();
  26. c.singASong();
  27. c.d1.danceADance();
  28. c.d1.danceADance();
  29. }
  30. }/*output: i'm singing i'm dancing cai$dancer@45ee12a7已经跳了1次 i'm dancing cai$dancer@45ee12a7已经跳了2次 */
  • 定义了成员内部类,以方便创建多个实例。从同一个类创建多个实例,但各个实例能保持各自的状态。
  • 新增了成员count,它保持了自己实例的状态。

不同的方式实现同一个接口

  1. abstract class sing{
  2. abstract void singASong();
  3. }
  4. abstract class dance{
  5. abstract void danceADance();
  6. }
  7. class cai extends sing{
  8. @Override
  9. void singASong(){
  10. System.out.println("i'm singing");
  11. }
  12. class dancerWild extends dance{
  13. int count = 0;
  14. @Override
  15. void danceADance() {
  16. System.out.println("i'm dancing wild");
  17. System.out.println(this +"已经跳了"+ (++count) +"次");
  18. }
  19. }
  20. class dancerGentle extends dance{
  21. int count = 0;
  22. @Override
  23. void danceADance() {
  24. System.out.println("i'm dancing gentle");
  25. System.out.println(this +"已经跳了"+ (++count) +"次");
  26. }
  27. }
  28. dance d1 = new dancerWild();
  29. dance d2 = new dancerGentle();
  30. }
  31. public class multi {
  32. public static void main(String[] args){
  33. cai c = new cai();
  34. c.singASong();
  35. c.d1.danceADance();
  36. c.d2.danceADance();
  37. }
  38. }/*output: i'm singing i'm dancing wild cai$dancerWild@45ee12a7已经跳了1次 i'm dancing gentle cai$dancerGentle@330bedb4已经跳了1次 */

发表评论

表情:
评论列表 (有 0 条评论,154人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 内部实现多重继承

    ava里面是没有多重继承的,因为永远是单根继承。但是通过内部类的继承,保存一个内部类的对象,可以模拟出一种多重继承。 匿名内部类实现 假如这里有一位蔡同学,他喜欢...

    相关 Java实现多重继承技巧

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承。有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的

    相关 面试题-实现多重继承

    > 多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承。有些时候我们会认为如果系统中需要使用多重继承往往都是糟