Java/Java开发框架 数据库相关教程 大数据相关教程 HTML/CSS相关教程 JavaScript/前端框架 开发工具相关教程 后端开发相关教程 Java开发技术 Java面试题库 Java架构设计 大数据资讯 大数据技术 大数据应用 Python开发技术 HTML HTML5 CSS JavaScript jQuery Vue AngularJS MySQL Oracle SQLServer MongoDB Redis

详解java为什么不允许类多重继承却允许接口多重继承

发布时间:2020-05-20 10:15:03  作者:本站编辑  来源:本站原创  浏览次数:

摘要:这篇Java开发技术栏目下的“详解java为什么不允许类多重继承却允许接口多重继承”,介绍的技术点是“详解Java、多重继承、Java、详解、接口、继承”,希望对大家开发技术学习和问题解决有帮助。

首先看下面这一段代码:

interface a{
  void b();
}
interface a1 extends a{
  void b();
}
interface a2 extends a{
  void b();
}
interface a12 extends a1,a2{
  void b();
}
public class Main {
  public static void main(String args[]){
 
  }
}

上面a1和a2都继承了接口a,都获得了b方法的定义。然后a12又多重继承了a1和a2。同样,a12获得了b方法的定义。

但是假设上述代码中的接口都换成类,假如a12没有对b方法作覆盖,那么再假如a1对b方法作了实现,然后a2也对b方法作了实现,那么a12继承的b方法究竟来自于哪个类里的b方法呢?这里似乎舍弃掉哪个方法都不太好。

所以类的多继承会出现矛盾。

接口由于都没有具体实现,所以不会出现这个矛盾。

有人可能会问,那既然没有实现就可以多继承,那么抽象类可以不可以多继承呢?

答案是不可以的!

具体为什么不可以,请继续关注我的博客~ 

好了,还是现在就说吧,抽象类跟普通类在多继承这块我觉得是差不多的。

看下面代码:

abstract class a{
  abstract void b();
  void c(){
    System.out.println("c()");
  }
  abstract void d();
  abstract void e();
  abstract void f();
}
 
abstract class b extends a{
  abstract void b();
  abstract void d();
  abstract void e();
  void f(){
    System.out.println("f()");
  }
  /*abstract void f();*/
}
 
abstract class c extends a{
  abstract void b();
  abstract void d();
  abstract void e();
  abstract void f();
}
 
public class Main {
  public static void main(String args[]){
  }
}

假设我们有个类d要继承b和c,而且还不重写f方法,那么问题来了,类d里面的f方法是用谁的f方法呢?你可能会觉得,类b都实现了,当然是类b里已经实现的f方法啊?

你这样认为的话,那java编译器还认为类c里面的抽象方法f也是一个值得保留的特性呢,这时候矛盾就来了...

但是用接口的话,就很单一了,所有的接口都没有实现~所以随便从哪个接口里来继承并覆盖这个方法都无所谓~

以上所述是小编给大家介绍的java为什么不允许类多重继承却允许接口多重继承详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对Java大数据社区网站的支持!

文章关键词: 详解Java 多重继承 Java 继承 接口 详解

  • 0

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

评论已有 0

相关文章

加载更多