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()方法?