Common Sense
学习Java语言的一开始,就被任何一本教科书告知,Java语言是不支持多重继承的。但是可以利用接口完成多重实现。于是这个“事实”就作为一条常识,神一样的存在了。
Why can not?
当被问及这条神律为啥在Java语言中存在时,很多人就说不清楚了。老外的这篇文章说了大家比较公认的一个问题:“钻石问题”。这里,具体的细节请参考上面原文,下面把原文中的一个关键性说明图例摘抄过来:
看到这个图片,大家应该了解了。
这里,从类的继承体系的最上层A开始,所有子类都有一个foo()方法。当D类没有override他的父类(们)的foo()方法时,如果在程序的运行期,当前的对象引用指向的是D的对象实例,并且调用了他的foo方法,那问题就来了,这个foo()到底使用B的foo()还是C的foo()呢?
说到这里,就涉及到了Java语言本身对多态机制的实现了。
JVM在运行期,在调用方法时,会invoke当前实例的对应的方法。如果当前实例对应类存在这个方法(比如foo),就直接使用当前实例对应类的foo方法,如果当前实例对应类并不存在这个方法,则按照继承关系,从下往上对父类进行搜索。直到找到为止,并进行调用。
说到这里,我们似乎可以得出结论:Java确实不应该支持多重继承!
Why other language can work around the problem?
如果想想像C++这种面向对象的语言,同样也存在这个问题,但是C++本身却没有排斥多重继承的机制,而且直接在语言层面提供了支持。所以,可想而知,多重继承本身并不是技术上不可解决的问题。但排除了上面所说的“钻石问题”的因素之外,还有啥其他的原因让Java不支持多重继承呢?
上面的那篇老外文章中也提到了一个原因是要简化设计。这点理解起来并没有那么好懂,至少目前我自己理解的并不透彻。。。
- 大小: 11.6 KB
分享到:
相关推荐
9. Java 语言为什么不支持多重继承: - 为了程序的结构能够更加清晰从而便于维护。 - 假设 Java 语言支持多重继承,类 C 继承自类 A 和类 B,如果类 A 和 B 都有自定义的成员方法 f() ,那么当代码中调用类 C 的 f...
Java语言设计时,选择不允许类进行多重继承,但允许接口的多重继承,这是基于多方面的考虑,主要是为了防止出现歧义、保证代码的稳定性和可维护性,以及推动面向接口编程的设计理念。以下是对这个话题的详细解释: ...
但这并不代表Java的interface就比较差,因为interface的观念较简单,全部动态的抽象函数也正代表着Java为一纯物件导向语言。与C++不同的是,C++考虑许多执行效率的问题,所以语言本身就变的较复杂化,同时C++的...
"Java语言程序设计第三版-习题答案.pdf" Java语言程序设计第三版-习题答案.pdf是Java语言程序...但是Java语言也有一些明显的区别,如取消多重继承和运算符重载、内存管理由程序员移向Java内嵌的自动内存回收机制等。
然而,Java选择了单继承,即一个类只能有一个父类,但可以通过接口实现多重继承的效果。 Java之所以不支持多继承,主要出于以下几个考虑: 1. **避免菱形问题**:菱形问题是多继承中最著名的难题。当一个类同时...
在C++编程语言中,多重继承是一个特性,允许一个类(子类)继承自多个基类(父类)。这种设计模式使得子类可以同时获得多个基类的特性,增加了代码的复用性。然而,多重继承也带来了一些复杂性和潜在的问题,其中最...
C++等语言支持直接的多重继承,而Java则通过接口机制来实现类似的多重继承特性。本文将详细介绍如何在Java中利用接口来实现多重继承,并探讨接口在Java中的作用及其限制。 #### 二、接口的基本概念 1. **接口的...
继承的特点:只需明确一点,java 只支持单继承,不支持多继承,但支持多重继承。 Java 中继承的实现方式有两种: 1. 单继承:一个子类只能继承一个父类。 2. 多重继承:一个子类可以继承多个父类,但 Java 语言中...
- **多重继承、GOTO语句、名字空间**:JAVA不支持多重继承,避免了钻石问题,但通过接口实现了多接口继承;不支持GOTO语句,避免了代码的混乱;使用包(package)来组织类,类似于C++的名字空间。 #### 开发环境的...
但是,通过实现接口的方式可以实现多继承,这样Java语言获得了多重继承的许多优点,并摒弃了由于多重继承带来的某些缺点。 其次,类继承中,一个类只能继承其他类所有的非私有成员变量和方法,并添加自己特有的成员...
C++、Common Lisp 等语言支持多重继承,但是 Java 不支持。这是因为多继承可能会带来一些问题。 首先,多继承可能会导致变量的ambiguity。如果一个子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法...
3. **继承**:C++支持多重继承,而Java仅支持单继承,但可以通过接口实现多继承的效果。 4. **速度**:C/C++的运行速度通常比Java快,因为Java需要JVM解释执行。 ### Java的开发环境 - **J2SDK**(Java 2 Software ...
接口则是一种定义行为规范的方式,它仅包含抽象方法的声明,不允许实现具体的方法,但允许多个类实现同一个接口,从而支持多重继承的特性。 ### Java中的继承 Java中的继承基于`extends`关键字,它允许一个类...
Java支持单继承,但可以通过接口实现多重继承的效果。多态性让代码更加灵活,可以处理不同类型的对象。理解这些概念对于写出可扩展和可维护的代码至关重要。 此外,Java还提供了丰富的标准库,如IO流、线程、网络...
- Java不支持多重继承,意味着一个子类只能继承一个父类。但可以通过实现多个接口来达到类似的效果。 - 子类对象在构造时会调用父类的构造方法。如果子类构造器没有明确调用父类构造器,会默认调用父类无参构造器...
然而,Java通过接口(Interface)支持多重继承的类似效果,一个类可以实现多个接口。 方法重载(Overloading)是指在同一个类中,可以有多个方法具有相同的名字,但参数列表必须不同(参数类型、数量或顺序不同)。...
太阳微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言” Java不同于一般的编译语言或解释型语言。它首先将源代码编译成...
- Java支持单重继承,即一个类只能继承一个父类,但可以通过实现多个接口来实现类似多重继承的功能。 4. Java的包和命名空间 - Java通过包(package)来组织类,包名通常全部小写。 - 创建包的语句应该放在Java...