为什么类只能单继承,而接口可以多继承?
我们都知道,在java当中类只可以单继承,而接口可以多实现.
总结:
(在不重写方法的情况下)接口是可以多继承的,在多继承的过程中子接口并不能对该抽象方法进行修改,到最后,B,C两个method方法在D中合二为一了。
先看一下下面的例子,再来看看这句话哦
我们现在通过菱形继承的例子来验证一下
1.接口的菱形继承(多继承)(抽象方法)
interface A
{void method();
}
interface B extends A
{}
interface C extends A
{}
interface D extends B,C
{void method(); //方法合二为一
}
我们可以看到,因为抽象方法没有方法体,所以子接口的继承并不会影响该方法。
那,如果换成默认方法呢?
注意:如果接口中的抽象方法被换成默认方法了,且子接口不要脸的重写了默认方法(虽然默认方法是可以不被重写的),那菱形继承就会发生错误。
interface A
{public default void method(){}
}
interface B extends A
{@Overridepublic default void method(){System.out.println("B不要脸的重写了A的默认方法");}
}
interface C extends A
{@Overridepublic default void method(){System.out.println("C不要脸的重写了A的默认方法");}}
interface D extends B,C
{//编译报错 不能合二为一了
}
你看,子接口继承默认方法并重写了,影响了method方法,所以菱形继承发生错误了。
2.类只能单继承的,
**总结:**因为类在继承的过程中可以重写该方法,B C方法虽然都是method,但是,由于B,C中的method是有方法体的,可以重写内容,所以不一样了。随后,到了D中,这两个方法同名,但又不是重载形式,故矛盾了。
先看看下面的例子,再返回来看上面这段话。
class A
{public void method(){}
}
class B extends A
{@Overridepublic void method(){System.out.println("bbb");}
}
class C extends A
{@Overridepublic void method(){System.out.println("ccc");}}
class D extends B,C
{//类编译错误
}
于是,我们又发现,子类继承父类,重写了这个方法,也影响了该方法,所以菱形继承发生错误了。
本人水平有限,如果有什么不对的地方,欢迎各位大佬指正。
为什么类只能单继承,而接口可以多继承?相关推荐
- java 由接口构造对象_Java学习笔记04——类和对象|抽象和接口|构造方法与继承...
六.Java类 1. Java中用关键字class来创建类. 2. 类中属性和方法称为类的成员;类的声明和方法要在同一个文件内,不同于C++. 3. 类的定义: [] class [extend ...
- java 接口继承_接口是否可继承接口(java)
展开全部 Java语法中,接口32313133353236313431303231363533e59b9ee7ad9431333366303839可以继承接口,抽象类可以实现接口,抽象类可以继承实体类 ...
- php类的继承和,详细对比php中类继承和接口继承
PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承 比如: class frist{ public function __construct(){ echo &q ...
- php 接口继承,详细对比php中类继承和接口继承
PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承 比如:class frist{ public function __construct(){ echo &qu ...
- java只允许单一继承_问题:Java语言只允许单继承,指每个类只能有一个 ( )
问题:Java语言只允许单继承,指每个类只能有一个 ( ) 更多相关问题 用List命令显示表文件中的当前记录的命令格式是________. WHERE子句的条件表达式中,可以匹配0个到多个字符的通配 ...
- java第四节 类的继承/抽象/接口/多态性
/* 类的继承 类的继承可以简化类的定义 java只支持单继承,不允许多重继承 可以有多层继承,即一个类可以继承其一个类的子类,如类B继承了类A,类C又可以继承类B 那么类C也间接继承了类A子类继承父 ...
- java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...
0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...
- Java面向对象(接口、匿名内部类、object类、单例、多例)
1.1接口(抽象类与接口,优先使用接口) 抽象方法和全局常量的集合,使用interface定义,使用implements继承 接口可以多继承(可以向上强制转换) 接口只能有public,一般不写常量 ...
- 【C# 复习总结】类、继承和接口
1 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat{}class Cat:object{} C#中所有的类都是默认由object类派生来的,显示指定或者省略 ...
最新文章
- 并发编程之多进程编程(python版)
- 数据结构_顺序栈的代码实践
- RAC修改数据库的spfile位置
- ALV报表中设置可修改字段
- python 基础教程(第二版)
- Android之内核学习笔记
- ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“
- C++11多线程----线程管理
- 【英语学习】 - 君若不离不弃,吾当生死相依
- Node.js ES6模块化
- ZigBee协议分析仪Smart PacketSniffer
- 动态网站加速,cdn义不容辞
- ON_NOTIFY处理消息
- 对于TGA格式文件的分析
- HTML字体以及图标字体iconfont、Font Awesome的使用
- MBA联考-20101213
- Typora+Git+Gitee实现个人笔记自动同步
- 《好想好想谈恋爱》经典对白
- Illustrator如何使用图形对象的特殊效果之实例演示?
- chrome升级后无法访问iframe页面