Java 你的多继承纳?

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

作者:Orson 
出处:http://www.cnblogs.com/java-class/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/archive/2013/05/20/3087871.html

时间: 2024-11-16 23:06:52

Java 你的多继承纳?的相关文章

Java的接口和继承

1.JAVA里没有多继承,一个类只能有一个父类.而继承的表现就是多态.一个父类可以有多个子类,而在 子类里可以重写父类的方法(例如方法print()),这样每个子类里重写的代码不一样,自然表现形式就不一 样.这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不 一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果.举例说明: //父类 public class Father { //父类有一个打孩子方法 public void hit

问一个Java泛型与类继承的问题

问题描述 问一个Java泛型与类继承的问题 直接上代码了 //DeviceRepository类 public abstract class DeviceRepository<T extends Device> extends DomainRepository<T> //DeviceEventHandler类第一种写法 public abstract class DeviceEventHandler<M extends Device,R extends DeviceRepos

继承 覆盖 多态-java私有方法可以继承吗

问题描述 java私有方法可以继承吗 私有的成员和方法可以在子类中被继承吗,如果不能为什么不能,求解详细点 解决方案 java继承中的"缺陷":"覆盖"私有方法java继承中的"缺陷":"覆盖"私有方法Java 继承与初始化."覆盖"私有方法 解决方案二: 首先说私有的成员和方法不能被子类继承,这是java语法规范强制规定,也是面向对象设计的原则. 其次,脱离具体的语言,从面向对象角度来看,用private

Java 三大特性之继承

Java 三大特性之继承 继承可以不用重新编写已有的特性,同时又可以根据需求来覆写方法 父类:   Java代码   public class Father {       protected String getText(){           return "I am Father";       }   }       子类:   Java代码   public class Son extends Father{       protected String getText()

在java中接口可以继承接口吗?

问题描述 在java中接口可以继承接口吗? 答案是可以,但是接口继承接口的意义何在? 我觉得接口最大的作用就是规范程序的结构,如果接口继承一个接口,这是要干嘛啊? 解决方案 不仅可以继承,还可以多继承.可以用来扩展功能啊,这样不用修改父借口,方便维护.体会过具体应用场景就明白了. 解决方案二: 接口可以多继承,,但类只能单继承,,多实现 解决方案三: 这得根据你的业务场景来说.接口的继承就像类的继承一样.继承父类或者父接口的方法或者参数.

java接口中多继承的问题

java中支撑多继承吗? 支持->接口啊 为什么接口支持多继承呢?因为接口中没有方法体!即使可能两个接口中有一样的抽象方法,但是 只会调用子类中覆盖该同样抽象方法的具体方法!不会引起调用的歧义! interface A{    public abstract void show(); }   interface B{    public abstract int show(); }   interface C extends A, B{      } /*     相同的函数名,函数参数 但是不

澄清Java语言接口与继承的本质

继承 计算机学院研二的兄弟与我讨论Java,一见面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该使用接口?很庆幸他们不是问我Java如何连接SQL Server,或者是如何开发J2EE应用,这类问题有杀伤力,避之则吉.今年计算机学院本科有个毕业设计课题是做J2ME,选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包,这个这个--唉. 大多数人认为,接口的意义在于顶替多重继承.众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口.其实这样做是很牵

Java语言接口与继承的本质

  计算机学院研二的兄弟与我讨论Java,一见面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该使用接口?很庆幸他们不是问我Java如何连接SQL Server,或者是如何开发J2EE应用,这类问题有杀伤力,避之则吉.今年计算机学院本科有个毕业设计课题是做J2ME,选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包,这个这个--唉. 大多数人认为,接口的意义在于顶替多重继承.众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口.其实这样做是很牵强

Java修饰符和继承

java类的成员变量通常有以下几种访问修饰符: public.private.protected或者缺省, 例如在package first 中如果有一个类FirstClass有四个变量: public int pp; private int xiaopp; protected int dd; int xiaodd; 如果在package first 中有另一个类SecondClass继承了FirstClass: 那么他将继承FirstClass中的三个变量,分别是: public int pp