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吸引许多人的魅力之一了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源项目导入eclipse的一般步骤[转]

下载到开源项目后,我们还是希望导入到eclipse中还看,这样要方便点,一般的步骤是这样的 打开源代码目录, 如果看到里面有.calsspath .project文件,那么说明这个项目本来就是eclipse开发的,那么在eclipse中-&…

死锁活锁

死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源…

说说可重复函数(Reentrant) 和线程安全(thread-safe)的区别与联系

在讲可重复函数与线程安全之前先来了解什么是可重复函数和线程安全。可重复函数:在多线程或有异常控制流的情况下,当某个函数运行到中途时,控制流(也就是当前指令序列)就有可能被打断而去执行另一个函数.而"另一个函数"很有可能是它本身.,如果…

inputn函数与input函数的区别

inputn函数与input函数的区别(这里的比较类似于前面的inputc函数) ①input函数可以将字符型变量转换为字符型或数值型,这取决于指定的输入格式informat;而inputn函数只能将字符型变量转换为数值型。从这个角度上看,跟inputc函数一样&#xff…

Blazor中的无状态组件

声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件。1. 什么是无状态组件如果了解React,那就应该清楚,React中存在着一种组件,它只接收属性,并进行渲染,没有自己…

一次性撤稿70篇!中国学者论文再现大规模撤稿 | 附全名单

全世界只有3.14 % 的人关注了爆炸吧知识2021年1月20日,英国皇家化学学会(Royal Society of Chemistry,简称RSC)表示,他们正在考虑撤回68篇可能出自“论文工厂”的文章,但当时并没有公布这68篇文章的详情。近…

git代码库的使用

代码库/使用指南 http://learn.zone.jd.com/cmsuser/index.htm 在win7系统下使用TortoiseGit(乌龟git)简单操作GitOSC http://my.oschina.net/longxuu/blog/141699转载于:https://www.cnblogs.com/mssql8/p/3773995.html

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。 首先&…

搭建SVN服务

SVN版本管理工具管理着随时间改变的各种数据像普通文件服务器或者ftp服务器,但是,SVN会备份并记录每个文件每一次的修改记录Subversion官网:http://subversion.tigris.org/http://subversion.apache.org/svn客户端: http://tortoi…

linux awk命令总结

1. 除去重复项, 这个不多说, 只给出代码: awk !a[$0] file(s) awk !($0 in a){a[$0];print} file(s) 另一种:http://bbs.chinaunix.net/thread-1859344-1-1.html 2. 计算总数(sum),如&#xff1a…

ubuntu环境下如何安装jdk,安装eclipse,安装android studio总结

1 安装jdk总结: 先下载ubuntu的jdk,然后解压,放入文件夹,然后在profile里面配置,关键命令如下 sudo gedit /etc/profile 然后加入以下配置 export JAVA_HOME=/usr/local/java/jdk1.6.0_30 export JRE_HOME=/usr/local/java/jdk1.6.0_30/jre export CLASSPATH=.:$JAVA_HOM…

MegaCli 监控Raid状态

MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前 raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等。通常,我们对硬盘当前的状态不太好确定,一般通过机房人…

巧用ActionFilter的AOP特性,为返回的数据增加返回码和消息

背景对于处理接口返回值统一加密,过滤,特定值统一处理,统一返回等多种需求,net的拦截器前置拦截比较常用,例如:登录校验,参数格式校验等等。接下来介绍filter。filter过滤器实现filter的ActionF…

研究表明,胸大无脑是不存在的......

1 求车主心里阴影面积▼2 不管成不成功大叔是你坚实的后盾▼3 小岳岳的“全球分鹏”▼4 胸大无脑是不存在的!▼美国芝加哥大学曾对1200名女性进行实验,胸部丰满女性在智商测试中的平均得分反而比胸部扁平的女性高出了10分。5 你也是个逻辑鬼才▼6 想…

每日一小练——按字典顺序列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来。 解答&#xff…

CSS 特殊性、继承与层叠

一、特殊性规则 选择器的特殊性由选择器本身的组件确定;特殊性由四个部分组成,其初始值为0,0,0,0。 1. 对于选择器中的每一个id,记0,1,0,0; 2. 对于选择…

Android 之6.0 双向通话自动录音

可以先参考下这篇博客,讲得比较详细 http://www.jizhuomi.com/android/example/354.html 然后我看到这篇博客很叼,其它的文章质量也非常不错,http://blog.csdn.net/gyhgx/article/details/51669892 项目中需要实现基于Android 6.0 的双向通…

void 类型的指针

void指针是空类型的指针,也称为无类型的指针,它不指向任何类型,即它仅仅是个地址。因此void指针不能进行指针运算,也不能取其所指向的数据的值 只有将void指针跟其他类型的指针相关联,才能使用他,可以将其他…