Java中支持多重继承吗,为什么?

2021-04-29 20:49发布

13条回答
某知名啥也不是博主
1楼 · 2021-05-14 11:13.采纳回答
java语言为了可维护性高及清晰的设计思想, 最终不采用多重继承。如果有多重继承,一个子类同时继承两个父类想用的行为,最终最终采用那一个继承呢?所以为了简化避免这种问题的产生,最终不支持多继承。如果希望有这层关系的产生,可以采用接口实现,由于接口只有方法声明而且没有提供任何实现,因此只有一个特定方法的实现,因此不会有任何歧义。
三岁奶猫
2楼 · 2021-04-30 10:44

接口支持多重继承,实现类不支持只允许一个。这主要是防止增加程序的复杂性,模糊性,导致面向对象的概念不清,当然必须涉及安全性。这个多年来都有争议的问题。

灰机带翅膀
3楼 · 2021-04-30 11:44

为什么Java不支持多重继承,可以考虑以下两点:


1.第一个原因是围绕钻石GEM形继承问题产生的歧义。考虑一个类A有foo()方法,然后B和C派生自A,并且有自己的foo()实现,现在D类使用多个继承派生自B和C,如果我们只引用 foo(),编译器将无法决定它应该调用哪个foo()。这也称为Diamond问题。


那为什么C++可以支持多重继承而Java不行。嗯,在这种情况下,它不是因为技术难度,而是更多的可维护和更清晰的设计是驱动因素。


2.对我来说第二个也是更有说服力的理由是,多重继承确实使设计复杂化并在转换、构造函数链接等过程中产生问题。假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。此外,Java可以通过使用接口支持多重继承来避免这种歧义。由于接口只有方法声明而且没有提供任何实现(或提供了一个默认实现),因此只有一个特定方法的实现,因此不会有任何歧义。


java并不支持这项特性,但是这样的功能也是可以直接使用方法进行实现,就是用起来比较的啰嗦,c++一个运算符搞定的事情,java需要写一个方法调用。 对面向对象的语言来说,运算符本身就不够“面向对象

summer
5楼 · 2021-04-30 17:57

支持的

嘿呦嘿呦拔萝卜
6楼 · 2021-04-30 18:24

每个语言有每个语言的特性,运算符重载不是java支持的特性,也没有规定必须有替代实现。 就像java至今不支持闭包一样,运算符重载也没有代替实现。 对面向对象的语言来说,运算符本身就不够“面向对象”,一切都可以用方法来实现

接口实现为何就不会存在二义性问题?

很简单,因为接口中的方法,是抽象的(从JDK1.8之后,接口中允许给出一些默认方法的实现,这里不考虑这个),就算一个类实现了多个接口,且这些接口中存在某个同名方法,但是我们要清楚的知道,这个同名方法最终需要由这个类自己来实现,所以并不会出现二义性的问题。

但是还有问题,如果不同接口中定义了相同的方法不会造成二义性的问题,但是接口允许定义 public static 的变量啊,那如果变量名一样,不也是会有二义性问题吗?

我们来自己验证一下这个问题,定义两个接口,两个接口中都声明一个叫做 num 的整型变量。

package InnerClass;public interface Inter1 {  public static final int num = 1;}
package InnerClass;public interface Inter2 {  public static final int num = 2; }

之后声明一个测试类 test 去实现这两个接口,且在该测试类的 main 方法中,访问这个 num。

package InnerClass;public class Test implements Inter1,Inter2{  public static void main(String[] args) {  System.out.println(num); }}

我们执行一下编译。

编译都无法通过。。。所以说 Java 的多接口实现避免了二义性问题。而如果你就想要多重继承,多接口实现满足不了你的话,那么你可以采用内部类的方式来设计你的程序,它在一定程度上弥补了 Java 的不支持多继承的缺陷


任@先生
8楼 · 2021-05-05 11:54

Java本身是不支持的。但是可以通过其他渠道实现

ZGSYT
9楼 · 2021-05-06 11:10

接口支持多重继承,实现类不支持多重继承

相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问