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)的区别与联系

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

Blazor中的无状态组件

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

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

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

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

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

搭建SVN服务

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

MegaCli 监控Raid状态

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

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

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. 对于选择…

解读WPF中的Xaml

1.Overview这篇文章主要分享从源代码角度解读wpf中xaml。由于源码查看起来错综复杂“随便找一个对象按下F12就是一个新的世界”,看源码的感觉就是在盗梦空间里来回穿梭;所以也是耗费很长的时间去阅读源码然后根据自己的理解编写文章和贴出部分关键源码。…

寒门博士分享读博经历成“抖音网红”惹争议,博士该这么“不正经”吗?

全世界只有3.14 % 的人关注了爆炸吧知识最近在抖音上,一个名叫“相宜”的主播火了。短短几个月时间内,她就涨粉940万。而和一般网红不同的是,相宜是一位刚毕业的博士。带火她的视频,是她自述博士毕业后的感想,目前已经…

Android Nine-patch

做了好多客户端软件了,突然发现里面有好多图片都是重复的,个别只是大小不一样,每次都使用大量图片,导致软件过大,项目总结的时候才发现Android已经提供了一种解决方案了,这就是NinePatchDrawable&#xff0…

稍微成型点的用WEBSOCKET实现的实时日志LOG输出

难的是还是就地用JS显示出来相关的发布进度。 还好,花了一下午实现了。 可以移植到项目中去罗。。。 websocket.py: import tornado.ioloop import tornado.web import tornado.websocket from tornado.ioloop import IOLoop from datetime import timed…

.NET6之MiniAPI(四):配置

配置文件,是一个每个应用服务程序常用的功能,从原来的终端应用时代,到现在的元宇宙时代,配置都是很悠然自得的存在。asp.net core提供了强大的配置文件访问机制,不管是MVC API还是MiniAPI,使用方式都是相同…

.NET 6新特性试用 | PeriodicTimer

前言在.NET中,已经存在了5个Timer类:System.Threading.TimerSystem.Timers.TimerSystem.Web.UI.TimerSystem.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer&…