我们都知道java不支持多继承,就是一个子类不能有两个或多个父类,但是可以通过实现接口实现多实现,个人感觉也就是变相的多继承了,只不过是方法的实现交给了别人。

在我们所学的继承中是子类可以继承父类所有的成员变量和方法的(不包含private修饰的)

定义一个A类

public class A {private String name;String IDcard;protected int age;public int year;private void find(){System.out.println("find方法");}void find2(){System.out.println("默认");}protected void find3(){System.out.println("protected权限");}public void find4(){System.out.println("pubilc权限");}
}

然后B类继承A类

public class B extends A {}

那么B类就拥有了A类的非private属性和方法

因为继承某一个父类之后如果我们子类对父类的某个方法的实现不满意的话是可以进行方法的重写的,这里是单继承所以并没有什么冲突的地方,如果说我修改了B类,现在B类不继承A类了,我还给B类添加了find4方法

public class B  {public void find4(){System.out.println("B类的pubilc权限");}}

现在有一个C类来继承A类和B类,那么问题就来了,如果我的C类并没有重写find4的方法,我通过继承就是将父类的非private属性和方法都继承下来了,但是A类和B类都拥有find4方法,那么我调用的时候究竟是调用哪一个呢?这就造成了混乱,所以java里面是不允许多继承的。

多继承不行但是可以多实现,但是接口里面的方法在都是一些抽象方法(当然也有静态方法,jdk8之后还有了默认方法),这些抽象方法的实现就交给了别人来实现并不是自己实现的,所以多实现是可以的,但是在jdk8是出现了默认方法,我刚刚前面不是说到了多实现就是变相的多继承嘛,多了个默认方法又使得多实现会混乱了

interface faceA                   //定义接口faceA
{   void someMethod( );default public void DefaultMethod( )//定义接口中默认方法{System.out.println("Default method in the interface A");}
}
interface faceB                   //定义接口faceB
{  default public void DefaultMethod( )//定义接口InterfaceB中同名的默认方法{System.out.println("Default method in the interface B");}
}
class DefaultMethodClass implements faceA,faceB  //定义子类实现接口InterfaceA, InterfaceB
{  public void someMethod( )                    //实现接口InterfaceA的抽象方法{System.out.println("Some method in the subclass");}
}
public class Interfacsamedefaults
{  public static void main(String[] args){  DefaultMethodClass def = new DefaultMethodClass( );def.someMethod();               //调用抽象方法def.DefaultMethod();            //调用默认方法      }
}

实例化子类DefaultMethodClass的对象时,编译器不知道应该在两个同名的default方法中选择哪一个,因此产生了二义性。因此,一个类实现多个接口时,若接口中有默认方法,不能出现同名的方法。

Java之所以禁止多继承,就是想避免类似的二义性。但是接口中允许实现默认方法,又回到“二义性”的灾难之门

为什么接口会有默认方法?

以前创建了一个接口,并且已经被大量的类实现。
如果需要再扩充这个接口的功能加新的方法,就会导致所有已经实现的子类需要重写这个方法。
如果在接口中使用默认方法就不会有这个问题。
所以从 JDK8 开始新加了接口默认方法,便于接口的扩展。

所以很多时候都是有两面性的,只能自己根据实际情况使用了,但是我平时还没有使用过接口的默认方法。

思考之——java为什么不能多继承相关推荐

  1. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承 - 一个子类只能有一个父类 - 一个父类可以派生出多个子类 这里写图片描述 子类继承了父类,就继承了父类的方法和属性. 在子类中,可以使用父类中定义的方 ...

  2. Java面向对象封装和继承

    面向对象 什么是面向过程.面向对象? 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考"我该怎么做",然后一步步实现的过程. ...

  3. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程.]

    类的继承 Java只支持单继承,不允许多重继承  - 一个子类只能有一个父类  - 一个父类可以派生出多个子类    子类继承了父类,就继承了父类的方法和属性.  在子类中,可以使用父类中定义的方法和 ...

  4. java中如何实现继承_Java继承

    Java继承 1.什么是继承呢? 类似人类中的继承(继承上一辈.上上辈的东西),在Java中就是将一个已知的类进行拓展,让一个新的类来继承这个已知的类,这样就能使这个新的类具有已知类的属性和行为. 新 ...

  5. Java SE_封装、继承、object类、super-this关键字、方法重写、多态、instanceof、类型转换

    封装 该露的露,该藏的藏 我们程序设计要追求"高内聚,低耦合".高内聚:类的内部数据操作细节自己完成,不允许外部干涉:低耦合:仅暴露少量的方法给外部使用. 封装(数据的隐藏) 通常 ...

  6. Java基础小常识-继承-(10)

    一.继承的好处 1.好处: 1)提高了代码的复用性 2)让类与类之间产生了关系,给第三个特征多态提供了前提 2.Java中支持单继承,不直接支持多继承,但对c++中的多继承机制进行了改良. 3.单继承 ...

  7. java 接口 实现和继承关系

    一.抽象类 有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化.例如:有一个父类"水果(Fruit)",它 ...

  8. 【JavaSE_08】Java中static、继承、重写

    #一.Static 学习静态这个关键字,关键是抓住两个点: 1,关注其语法特点 2,关注其使用场景 案例讲解: 我们先从静态变量开始,当一个成员变量加上static修饰之后,会是一个什么效果? 比如创 ...

  9. 详细分析如何在java代码中使用继承和组合

    文章目录 继承与组合 何时在Java中使用继承 何时在Java中使用组合 继承与组成:两个例子 用Java继承重写方法 Java不具有多重继承 使用super访问父类方法 构造函数与继承一起使用 类型 ...

最新文章

  1. [Node.js]DNS模块
  2. python分布式事务_分布式事务的管理--atomikos
  3. the deep ritz method论文梳理
  4. c语言趣味小程序,一个有趣的小程序
  5. web mis系统构建
  6. JSON.parse和eval的区别
  7. 软考 信息安全工程师(第二版)笔记-第1章 网络信息安全概述
  8. NVIDIA 旧版显卡驱动下载及对应CUDA,CUDNN安装教程
  9. 数字转换大写英文字母
  10. Shi-Tomasi角点检测算法
  11. 重装mac系统 未能与恢复服务器取得联系,进入 macOS 系统恢复模式 – 重新安装 macOS 系统...
  12. 【译】Distributed Deep Learning - Part 1 - An Introduction
  13. 关于glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)的参数的一些理解
  14. mxgraph进阶(三)Web绘图—mxGraph项目实战
  15. 刘可-寂寞才说爱 试听+下载+歌词
  16. 跨考西电计算机科学与技术研究生经验贴,西安交通大学912计算机133分经验分享...
  17. 使用dnsmasq在本地将域名解析为CNAME别名
  18. 工作中我目前想做的事的清单
  19. Android 发布Google Play 应用市场(2021.10.18)
  20. 高性能服务器程序框架

热门文章

  1. 二叉树的递归遍历(树UVa548 紫书p155)
  2. 剑指长沙:如何用爬虫捕捉下一个线下餐饮独角兽?
  3. m.soudashi.cn 地图_做搜索引擎优化掌握好三个方向即可
  4. 求肺结节数据集,是要提取出来,分好类的肺结节数据集,有chang
  5. MATLAB/simulink与Amesim联合仿真之FMU
  6. matlab 函数句柄@的介绍_什么是函数句柄(转)
  7. 拿下阿里三面是后,面试官问我:你是怎么学习Redis的?
  8. chtMultiRegionSimpleFoam求解器的热源不在边界上【翻译】
  9. 1.调查问卷-接口文档
  10. 【超融合】超融合产品怎么选?