Java 基础【05】你的多继承纳?
Java省略了许多很少用到,缺乏了解,混淆功能的C + +,在我们的经验中带来更多的悲伤大于收益 。
-----James Gosling
James Gosling 这个人大家应该很熟悉,就是最初设计Java 语言的的程序员,被称为“Java之父”,现在也有50多岁了,前几天还看过他的视频,很平易近人的一个白头老人,可能和在中国小镇随处可见的老人是一样的,完全看不出是那 SUN 的副总裁,也没有中国商人特有的做秀和狡黠。
上面那段话是别人问到他关于 Java 为什么不能运算符重载(虽然它确实有方法重载),多重继承,以及广泛的自动强制转换时回答的一段话。他老人家说多继承会带来更多的悲伤,这悲伤到底在什么地方纳?以下是我自己的一点分析(如有不正,希望大神你出手):

多继承的优点是显而易见的,一个子类能有多个父类的属性和方法,比如上面的那个希腊神话当中的半人马先生,继承了人和马,上半身是人的躯干,包括手和头,下半身则是马身,也包括躯干和腿,既有速度又有思维和抓取东西的能力。
但是多继承的缺点也是一点就破:
(1)如果一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量;
贴段代码给看看:

public class ClassA {
protected String a = "same" ;
}
public class ClassB {
protected String a = "Unsame" ;
}
public class ClassC extends ClassA, ClassB {
public void printOut() {
System.out.println( super .a); //-----关键的一行-------
}
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut();
}
}

(PS:上面这段代码是不能编译的,我是举个例子而已) classC到底会打印same还是Unsame纳?
(2)如果一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法;
贴段代码看看:

class ClassA {
public void printOut() {
System.out.println( "same" );
}
}
class ClassB {
public void printOut() {
System.out.println( "Unsame" );
}
}
public class ClassC extends ClassA, ClassB {
public static void main(String[] args) {
ClassC classC = new ClassC();
classC.printOut(); //-----关键的一行-----
}
}

(PS:上面这段代码是不能编译的,我是举个例子而已) classC到底会调用上面哪个父类的printOur()方法?
上面的这些都是致命的歧义,所以java中禁止一个类继承多个父类;
但是那个白头发的老人在很多年前就给 java提供了接口,并能通过接口的功能获得多继承的许多优点而又摒弃了类与类多继承的缺点。
这到底是怎们做到的纳?嗯,好了,我们也来详细的分析一下:
java允许一个接口继承多个父接口,也允许一个类实现多个接口,而这样的多继承有上面提到的缺点吗?
因为有接口的抽象性,所以答案肯定是没有;
1)在接口中不能有实例变量,只能有静态的常量,每个静态的常量在程序开始运行前都已经初始化成功,如果有重命名的出现,编译器先生会及时的告诉你的;
2)接口中不能有具体的方法(包含方法体),只能有抽象方法,具体的方法只能由实现接口的类实现,在调用的时候也只会调用实现类的方法,这样是不会存在歧义的;
那门开篇的那半人马就可以这样来写了:

interface Humain {
String arm = "2只能抓东西的胳膊";
void output();
}
interface Horse {
String leg = "4只能跑的腿";
void output();
}
interface Half extends Humain, Horse {
}
public class HalfHorse implements Half {
// 实现上面俩个接口里面的同名方法
// 这个类拥有两个接口的静态变量
public void output() {
System.out.println("我是个有" + arm + "和" + leg + "的半人马");
}
public static void main(String[] args) {
HalfHorse halfhorse = new HalfHorse();
halfhorse.output();
}
}

(PS:上面这段代码是可以编译通过的)
因为引入了接口,所以程序员有很大空间的想象力,这可能就是Java吸引许多人的魅力之一了。
Java 基础【05】你的多继承纳?的更多相关文章
- Java基础-面向对象第二特征之继承(Inheritance)
Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...
- Java基础-四要素之一《继承》
继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 继承是所有OOP语言不可缺少的部分,在java中使 ...
- java基础讲解09-----接口,继承,多态
还有什么包装类,数字类,这些简单的我就不想过去介绍,前面也大概的介绍了下,继承,多态 1.类的继承 继承的思想:基于某个父类的扩展,制定一个新的子类.子类可以继承父类原有的属性,方法,也可以重写父类的 ...
- java基础知识(5)---继承
继 承:(面向对象特征之一)好处:1:提高了代码的复用性.2:让类与类之间产生了关系,提供了另一个特征多态的前提. 父类的由来:其实是由多个类不断向上抽取共性内容而来的.java中对于继承,java只 ...
- Java基础--面向对象编程3(继承)
1.继承的作用 为了提取两个类中公共的代码,可以使用继承抽取重复性的代码到一个公共类中. 这个公共的类称为父类(super class),继承于父类的类称为子类(sub class). 2.java继 ...
- 黑马程序员——JAVA基础之简述 类的继承、覆写
------- android培训.java培训.期待与您交流! ---------- 继承的概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只 ...
- java基础05 集合
一.集合的由来? 我们学习Java,可以操作很多对象 ,存储 的容器有数组和StringBuffer,StringBuilder; 而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们 ...
- [ 原创 ] Java基础2--构造方法的继承和重载
1.构造方法的重载是指同一个类中定义不同参数的多个构造方法,已完成不同情况下对象的初始化. 例如: Point(); Point(x); Point(x,y); 2.一个类的若干个构造方法之间可以相互 ...
- Java基础(六):继承
1.继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具 ...
- java===java基础学习(11)---继承
继承可以解决代码复用,让编程更加靠近人的思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法.所有的子类不需要重新定义这些属性和方法,只需要通过ex ...
随机推荐
- Hibernate知识梳理
一.SessionFactory接口 是单个数据库映射关系(ORM)经过编译后的内存镜像.SessionFactory(的实例)作为应用中的一个全局对象(工厂),可以随处打开/创建一个session, ...
- set 方法总结整理
#!/usr/bin/env python __author__ = "lrtao2010" #Python 3.7.0 集合常用方法 #集合是无序的,元素不能重复,元素只能是数字 ...
- UVA1589——xiangqi
开始碰到这个题时觉得太麻烦了直接跳过没做,现在放假了再次看这个题发现没有想象中那么麻烦,主要是题目理解要透彻,基本思路就是用结构体数组存下红方棋子,让黑将军每次移动一下,看移动后是否有一个红方棋子可以 ...
- 开源OA系统启动:基础数据,工作流设计
原文:http://www.cnblogs.com/kwklover/archive/2007/01/13/bpoweroa_03_baseandworkflowdesign.html自从开源OA系统 ...
- Python虚拟机之异常控制流(五)
Python中的异常控制语义结构 在Python虚拟机之异常控制流(四)这一章中,我们考察了Python的异常在虚拟机中的级别上是什么东西,抛出异常这个动作在虚拟机的级别上对应的行为,最后,我们还剖析 ...
- 解决debian 9 重启nameserver失效问题
目录 解决debian 9 重启nameserver失效问题 安装resolvconf 编辑文件 测试 解决debian 9 重启nameserver失效问题 刚安装完debian9,用过之后会发现/ ...
- 如何理解logistic函数?
作者:煎挠橙链接:https://www.zhihu.com/question/36714044/answer/78680948来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- April Fools Contest 2018
这个比赛不正经,但是我可以一本正经的写代码啊 A. Quirky Quantifiers time limit per test 2 seconds memory limit per test 64 ...
- list 类
题外:len = sizeof(a)/sizeof(a[0]); 求出数组长度 1.list是一种以双向链表方式实现的一种顺序容器.list容器中,存放元素的存储单元可以是连续的也可以是不连续的. 2 ...
- 算法golang篇
1.slice反转,偏移 func reverse(s []int) { , len(s) - ; i < j; i, j = i+, j- { s[i], s[j] = s[j], s[i] ...