全球视点!浅谈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中禁止一个类继承多个父类;

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

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

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

先屡清楚继承和实现的区别:

1 类继承类,实现接口。接口继承接口。

2 类只能单继承类(抽象类和非抽象类), 可以多实现接口。而接口可以多继承接口。

分析原因:

Java中类不能多继承类是为了安全。因为无论是抽象类还是非抽象类都包含非抽象的方法(非抽象类也可能没有),当类可以多继承类时,被继承的不同的父类可能会有同名同参的方法,如果子类也没有重写这个同名同参的方法,则在子类的实例调用这个方法的时候就会出现冲突。

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

为什么是多实现呢?

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

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

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

例如:class A继承了class B 和class C, 但是 class B和class C中有同名同参的方法method,且在A中并没有重写方法method,那在A的实例中调用method方法就会出现冲突,jvm就会不知道到底该调用哪一个方法。

class B { method(){}};
class C {method() {}};
class A extends B, C{};
A a = new A(); 
a.method();

此时在执行a.method()时冲突就会出现。

所以Java只能单继承。

到此这篇关于Java为什么只能单继承的文章就介绍到这了,更多相关Java 单继承内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

标签:

x 广告
中方呼吁关注叙利亚遭受恐怖主义威胁及外部占领问题

新华社联合国1月27日电(记者王建刚)中国常驻联合国副代表戴兵27日呼吁国际社会对叙利亚遭受恐怖主义威胁及外部

美乌总统通话讨论乌克兰局势

新华社华盛顿1月27日电(记者邓仙来)美国总统拜登27日与乌克兰总统泽连斯基通电话,讨论乌克兰局势。白宫当天发

安徽多地出现“桃花汛” 未来一周全省天气预报

3月16—17日,安徽出现了明显的降温和降水天气,多地出现了暴雨,局地大暴雨,气温也明显下降,18日最低气温甚至跌到了个位数。据气象部门

人民体谈:同唱一首歌,两岸共享冬奥荣光

1月25日,在北京冬奥会进入倒计时10天之际,由海峡两岸青年音乐人合唱的《我在北京等你》,唱响冬奥,让两岸同胞

兵贵神速赴战场 中铁四局铁军逆行战长春

奥密克戎变异株,正给国内疫情防控带来新的挑战。当前,吉林省疫情防控也到了最关键紧急的时期,吉林省政府迅速做出了兴建方舱医院的决策部

快手发布春节防诈攻略 助力老铁识诈反诈

日前,快手发布了一则《春节防诈攻略》,总结出春节期间极易出现的五种诈骗套路,意在“扫尘迎新、去诈存真”,帮

强化资源倾斜 徽商银行多措并举助推制造业高质量发展

制造业是立国之本、强国之基。作为现代经济的核心和实体经济的血脉,金融支持制造业高质量发展责无旁贷。近年来,徽商银行认真贯彻落实安徽

产业互联网发展渐入佳境 智慧应急建设未来可期

根据《2020联合国电子政务调查报告》显示,我国电子政务建设在疫情背景下突飞猛进,衡量国家电子政务发展水平核心

人民网评:有安全,才有年味

人们常说:家是春节的方向。虎年新春即将来临,很多人已经踏上了返乡旅途;也有人因为新冠肺炎疫情原因,选择就地

巴西中国和统会举办贺新春迎冬奥活动

人民网里约热内卢1月27日电 (记者吴杰、毕梦瀛)壬寅虎年新春、北京冬奥会双喜临门之际,中国巴西友人共同参与

x 广告

Copyright ©  2015-2022 起点城市网版权所有  备案号:皖ICP备2022009963号-12   联系邮箱: 39 60 29 14 2@qq.com