zoukankan      html  css  js  c++  java
  • Java中为什么要使用单继承而不是多继承?

    多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:

    (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量。

    例如:
    类ClassA:

    public class ClassA {
           protected int varSame = 0;
    }
    
               类ClassB:
    
    public class ClassB {
            protected int varSame = 1;
    }

    子类ClassC:(假设允许类与类之间多继承)

               public class ClassC extends ClassA, ClassB {
                       public void printOut() {
                               System.out.println(super.varSame);
                       }
                       public static void main(String[] args) {
                               ClassC classC = new ClassC();
                               classC.printOut();
                       }
               }
     

    上面程序的运行结果会是什么呢?输出0还是1?

    (2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法

    例如:
    类ClassA:

               public class ClassA {
                       public void printOut() {
                               System.out.println(0);
                       }
               }

    类ClassB:

               public class ClassB {
                       public void printOut() {
                               System.out.println(1);
                       }
               }

    子类ClassC:(假设允许类与类之间多继承)

    public class ClassC extends ClassA, ClassB {
                       public static void main(String[] args) {
                               ClassA classA = new ClassC();
                               classA.printOut();      // -------------------------  A行
                               ClassB classB = new ClassC();
                               classB.printOut();      // -------------------------  B行
                               ClassC classC = new ClassC();
                               classC.printOut();       //-------------------------  C行
                       }
               }

    上面程序的运行结果会是什么呢?A、B、C三行的输出是0还是1?
    正因为有以上的致命缺点,所以java中禁止一个类继承多个父类;

    在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
    对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在 多继承的第二个缺点;

    而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;

    而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
    对于一个接口继承多个父接口的情况也一样不存在这些缺点。

    总结:

    java中为什么要单继承,多实现,总结如下:

    若为多继承,那么当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清,因此用了单继承

    为什么是多实现呢?

    通过实现接口拓展了类的功能,若实现的多个接口中有重复的方法也没关系,因为实现类中必须重写接口中的方法,所以调用时还是调用的实现类中重写的方法

    那么各个接口中重复的变量又是怎么回事呢? 

    接口中,所有属性都是 static final修饰的,即常量,这个什么意思呢,由于JVM的底层机制,所有static final修饰的变量都在编译时期确定了其值,若在使用时,两个相同的常量值不同,在编译时期就不能通过

    参考:https://blog.csdn.net/jay198746/article/details/5630276

    https://blog.csdn.net/qq_40922859/article/details/89389590

    https://www.cnblogs.com/lclichao/p/10482851.html

  • 相关阅读:
    头信息已输出的报错信息位置定位
    阅读<php程序设计>笔记
    include、ruquire使用相对路径总结
    php中未定义的变量使用技巧
    Oracle官方教材(9i、10G及App 11i)
    Vista的软件兼容性
    轻松找回Vista序列号
    oralce定时执行存储过程任务设置步骤详细
    今天做了内存测试,发现真的是内存问题导致的一连串的问题
    网络邮盘(GMailStore) V3.0.2
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/15388241.html
Copyright © 2011-2022 走看看