博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 基础【05】你的多继承纳?
阅读量:6212 次
发布时间:2019-06-21

本文共 2693 字,大约阅读时间需要 8 分钟。

               

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

本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/archive/2013/05/20/3087871.html,如需转载请自行联系原作者

你可能感兴趣的文章
【原创】IPSec***理论干货送上,大神勿扰
查看>>
Zend Studio 主題更改
查看>>
變量的生存空間與作用域
查看>>
echarts 设置地图默认缩放比例 尺寸
查看>>
VMware期望企业达到100%虚拟化
查看>>
Jmeter 自定义测试请求(功能完善)
查看>>
同步模型与异步模型的区别(转)
查看>>
Js计算指定日期加上多少天、加多少月、加多少年的日期
查看>>
对抗拖库 —— Web 前端慢加密
查看>>
PHP内存池中的存储层
查看>>
]细数网站成功赢利须具备的四大核心要素
查看>>
PHP开发APP接口1——APP接口简介
查看>>
家用nas的过去现在和未来--2008n年
查看>>
Linux安装Zend Guard 和 ioncube
查看>>
android studio 2.1版本
查看>>
android点滴25:Fragment加载时犯的低级错误android.view.Infla...
查看>>
x264 slicetype 选定中的x264_lowres_context_init函数分析
查看>>
ListView使用方法
查看>>
java容器线程安全
查看>>
ios 调用相册 及 相册显示中文
查看>>