Java 基础【09】你的多继承纳?
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 基础【09】你的多继承纳?相关推荐
- Java基础-面向对象第二特征之继承(Inheritance)
Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...
- Java基础之面向对象的概念 继承---组合----枚举类
Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...
- Java基础篇:封装、继承、多态三大特性
目录: 一.Java三大特性之:封装 二.Java三大特性之:继承 三.Java三大特性之:多态 一.Java三大特性之:封装 1.什么是封装: 封装,就是将数据和基于数据的操作封装在一起,数据被保护 ...
- java===java基础学习(11)---继承
继承可以解决代码复用,让编程更加靠近人的思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法.所有的子类不需要重新定义这些属性和方法,只需要通过ex ...
- Java基础:成员变量的继承与覆盖
1.前言 最近在研究Java多态时,发现子类通过继承父类来实现Java中的多态.子类可以继承父类的成员方法和成员变量.子类中如果有同名的成员方法,并且方法的参数和返回值一样,那么这个子类定义的这个方法 ...
- Java基础入门笔记-构造方法的继承
代码如下所示: Child.java package my;public class Child extends Parent {public Child() {System.out.println( ...
- JAVA基础09——java输入
1.读取输入 Scanner in = new Scanner(System.in); String name = in.next() 案例一:读取一行和一个数字 public static void ...
- JAVA基础09对象和类
9. 对象和类 9.1 为对象定义类 类为对象定义属性和行为. 面向对象程序设计(OOP) 就是使用对象进行程序设计.对象(object) 代表现实世界中可以明确标识的一个实体.例如:一个学生.一张桌 ...
- Java基础09: StringBuilder_StringBuffer_ArrayList
day09.StringBuilder_ArrayList 课前回顾:String1.概述:代表字符串2.特点:a.凡是双引号的都是String的对象b.字符串是一个常量,不会改变c.可以共享d.底层 ...
- Java 基础 - 面向对象(不错N多教程集合)
著作权归https://pdai.tech所有. 链接:Java 基础 - 面向对象 | Java 全栈知识体系 本文主要介绍Java OOP 面向对象基础和相关类图.@pdai Java 基础 - ...
最新文章
- 敏捷团队如何通过Leangoo领歌迭代看板进行迭代规划和任务协同
- python在excel中的应用-python中的excel操作
- C++ string的使用
- boost::sort::pdqsort相关的测试程序
- 不带头结点的单链表------C语言实现
- 彻底理解Python中的yield
- 流程流转相关业务与流转的分离
- ffmpeg学习笔记-native原生绘制
- 均线带角度的指标_选股指标:均线角度并列向上,量能倍增飞扬趋势明显,短线操作可考虑...
- Java中的变量、数据类型和运算符
- 计算机并行处理专业,分布式计算机并行处理技术(论文).doc
- python三维可视化图,如何使用Python在(交互式)3D中可视化图形?
- ES的curl常用命令
- python 柱状图和折线图放在一起_一款多条折线与柱状图共存图表
- Android 插件化原理(三),通过hook启动插件Activity,修改Resources,调用插件资源
- 求生之路2显示组服务器,求生之路2配置文件改服务器组
- 牛逼哄哄的京东 JD-hotkey !
- Nginx配之负载均衡、缓存、黑名单和灰度发布
- 数据仓库(11)什么是大数据治理,数据治理的范围是哪些
- 电视云视听服务器无响应怎么回事,云视听企鹅停服怎么办?原因是什么?
热门文章
- tiny4412 linux+qtopia nfs网络文件系统的挂载
- Install OpenStack Kilo Dashboard wiht Nginx + uWSGI On RHEL7.1
- navicat 或者workbench 无法连接127.0.0.1(61)的解决方法
- ASP.NET MVC3中的ViewBag动态性
- Codeforces Round #149 (Div. 2)【AK】
- Android 绑定远程服务出现 Not Allowed to bind service
- 对使用CodeSmith模板生成NHibernate的代码的分析
- UrlReWriter 使用经验小结
- 高速缓冲存储器的功能、结构与工作原理
- python微博自动评论转发_python3 调用新浪微博api实现自动发布评论