Java为什么不支持多继承

发表于:2023-3-28 09:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Hoeller    来源:稀土掘金

  首先,思考这么一种场景,假如现在A类继承了B类和C类,并且B类和C类中,都存在test()方法,那么当A类对象调用test()方法时,该调用B类的test()呢?还是C类的test()呢?是没有答案的,所以Java中不允许多继承。
  但是,Java中接口是可以多继承的,比如:
  public interface A {
      void test();
  }
  public interface B {
      void test();
  }
  public interface C extends A, B{
      
      
  }
  为什么接口可以?
  因为都是A、B、C都是接口,就算A、B两个接口中都定义了test方法,因为接口中只是声明了方法,并没有真正实现方法,所以对于C接口而言并不会照成困扰,对于C接口而言它只是继承了同一个test()方法的声明而已,在使用时需要C接口的实现类来实现这个test()方法就可以了。
  public class C1 implements C{
      public void test() {
          System.out.println("hello Hoeller");
      }
  }
  那么接口中不是有default方法吗?那不是也可以在接口中来实现方法吗?
  我们直接来测试一下:
  public interface A {
      default void test() {
          System.out.println("a");
      }
  }
  public interface B {
      default void test() {
          System.out.println("b");
      }
  }
  public interface C extends A, B{
  }
  此时C接口会编译报错,报错信息为:
  com.hoeller.C inherits unrelated defaults for test() from types com.hoeller.A and com.hoeller.B
  翻不翻译都无所谓了,反正就是报错了,表示C接口不能同时继承两个接口中default方法test()。
  如果你问,那为什么C++中可以支持多继承,那得解释菱形继承、虚继承,本文就不分析了(因为我也不知道)。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号