开发者社区> 文艺小青年> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java 基础【05】你的多继承纳?

简介:
+关注继续查看

               

                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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
聊聊java中的多继承,解决Java8接口default方法多继承冲突问题【享学Java】(下)
聊聊java中的多继承,解决Java8接口default方法多继承冲突问题【享学Java】(下)
0 0
聊聊java中的多继承,解决Java8接口default方法多继承冲突问题【享学Java】(上)
聊聊java中的多继承,解决Java8接口default方法多继承冲突问题【享学Java】(上)
0 0
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
0 0
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
0 0
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
0 0
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
0 0
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
0 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
0 0
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
0 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
码出高效 阿里巴巴Java开发手册 1.4.0
立即下载
从《阿里巴巴Java开发手册》编写推广谈技术成长
立即下载
《阿里巴巴Java开发手册(终极版)》
立即下载