我刚做了一个采访,我当时问了一个问题。
采访者 -是否支持Java多重继承?
我 -不
采访 -在Java中的每个类扩展类对象(除Object类),如果我们在外部扩展一个类像
Class A extends B{
// some code here
}
那么你可以说,A类扩展B类和对象,这意味着它是多重继承。 所以你怎么能说Java不支持多重继承?
我 -其实B类扩展类对象,所以当你在A类扩展类B,则类A间接地扩展类对象。 这是多层次的继承,而不是多重继承。
但是我的回答并不能满足他。
就是我的回答是否正确? 或者我错了? 究竟内部发生?
我的答案是正确的吗?
是的,大部分,并在一定范围内你描述。 这不是多重继承:
这是你说的是,单继承与多个级别。
这是多重继承:从没有任何两个或更多个碱基继承“是一种”相互关系; 这将是沿用无关线,或从先前分叉线(在Java中,由于Object
始终是一个基础,这将是后者):
(图像学分: http://yuml.me在“破旧”模式)
实际上在内部会发生什么?
刚才你说:有多个层次。 当编译器解析上的一个实例的成员:
obj.member
...它看起来看是否类型obj
(在这种情况下是一类,说ClassB
)的member
,可能是因为它直接提供或将它有它通过继承。 在运行时,JVM使用member
的对象实际上有。
我之所以说“大多是”上面的是,Java有接口,如Java 8中也对接口“的默认方法”。 这会使事情变得复杂了一点,但你对各级答案是你所描述的面试官说关于上下文正确的Object
, ClassA
,和ClassB
。
接口一直使人们有可能在Java中,什么东西有一个“是”有两种不同类型的关系:从继承的类类型,任何它实现多种接口类型。 没有默认的方法接口是不实际的方式(类必须提供实现)多重继承,但他们也有可能使一个类有多个“是”不相关类型树的关系。 (我不是一个学术,这是可能的一个学术会争辩说,他们提供一个学术的方式多重继承。)
在Java 8,接口可以提供他们定义的方法,从而真正模糊的线条即使在实践层面的默认实现。 让我们来看看这多一点深刻:
假设我们有ClassA
:
class ClassA {
void doSomething() {
// Code here
}
}
和Interface1
:
interface Interface1 {
default void doSomethingElse() { // Requires Java 8
// Code here
}
}
最后ClassB
:
class ClassB extends ClassA implements Interface1 {
}
ClassB
继承的实现doSomething
从ClassA
。 但它也获得了“默认”版本doSomethingElse
从Interface1
。 我们没有实现它在ClassB
,但ClassB
不是抽象的:它真的有doSomethingElse
。 它得到它的接口 。 我用这个词“被”,而不是“继承”在那里,但是这看起来很像继承的默认方法。
这基本上是多继承“轻”(如在“淡啤酒”)。 它周围的棘手问题,真正的多重继承,如最终运行:
- 应该怎样类型
super
呢? (Java的8的回答是: ClassA
) - 为了什么你在运行构造函数? (Java的8的回答是:单谱系构造链接,接口没有构造函数)。
- 你运行你继承超过一次超过一次,多个构造? (Java的8的回答是:你不能继承构造函数不止一次,接口没有他们。)
- 如果您继承具有相同签名的多种方法,会发生什么? (Java 8的回答是:如果其中一人是从基类,这是一个的使用的一个;一个基类的实现可以覆盖多个接口的默认方法如果您有与在编译期不同的接口相同的签名多个默认方法。时间,这是一个编译时错误。如果接口一直没有阶级被重新编译改变,情况出现在运行时,它是一个运行时
IncompatibleClassChangeError
例外列出冲突的默认方法。)
你是对的
首先,对象类是超级/碱/父类每类包括用户定义的类。
所以,即使我们不提它明确,用户定义的类默认扩展Object类。
就像是
class A
class B extends A
but compiler read it as
class A extends Object
class B extends A
证明
对于更详细的检查这个继承Java文档
我的答案是正确的吗?
你是说,它是多层次的继承,而不是多重继承绝对正确的 。
只有层次结构的根是Object
,所有类不单独扩展对象。
计数器面试官:
如果所有的类扩展Object
,那么多少次的构造函数Object
将在被称为A a = new A();
答案只有一次,那将是层次结构的根。
是的,你是正确的......许多人所指出的那样。 我只想说,面试不仅是技术知识,它也是关于坚持你的枪。 有些面试官会问你的答案,不是因为他们想知道,如果你确信你的信念的同时也考验你如何教别人以及你如何处理一个权威人物。
对于第一点,如果你不能教别人,那么你不能成为导师。 如今,它是雇人谁可以指导初级开发....因为它是有道理的经济至关重要。
对于第二点,因为他们不想让你改变技术方面的问题,只是因为你的老板问你。 如果你的老板要求你从数据库中删除所有索引,因为它们占用了太多的空间,你会怎么做呢? 你会尝试以其他方式说服你的老板? 怎么样?
Does java support multiple inheritance?
是的接口,但不上课。
类和接口可以实现多个接口,而是延伸只有一个类
你的答案是正确的!
class Object //for illustration purpose
{
}
class B
{
}
class A extends B
{
}
当你创建一个类的对象, 构造函数链发生。 即A类的构造函数调用super()
隐式,因此类B的构造函数被调用,然后调用其超类隐式这是对象类。
在Java中,因为类的构造函数只调用一个超类构造函数的类只扩展一个类。 因为他们没有构造函数这是不是在界面的情况下实现。
还创建类A的一个对象时,并且假定已定义两类A的构造函数和B,那么类B的构造函数被首先执行,然后类A的构造
你的答案是完全没有问题。 您可以从Java对象类interms的多级继承支持解释
你的答案是正确的,因为Java不从类支持多重继承。 Java支持从接口多重继承,并没有任何其他的继承。 但是你可以使用类的成分,但这是另一个故事。
真是一个愚蠢的问题。
当然,Java不支持多重继承和接口是不可继承。
继承只发生通过“扩展”,而不是通过“工具”。 当你定义一个类实现多个接口,你不是说这将是那些接口的扩展,但它具有相同的行为,以及行为(至少在Java中),没有定义继承。
对于Java支持多重继承,它需要支持像
public class MI extends Object, MyOtherClass
它Java可以不是。
好吧,也许我就不会得到这份工作调用面试官的提问愚蠢:)
你的答案是绝对正确的。
这些类型的刚才问的问题,检查考生是否是概念上强不强。
那么最简单和准确的回答这个问题是在这里:
“ 类可以从被从自类派生的,等等,并最终从最上面的类派生的类派生的类中派生,对象,这样的类被说成是从所有类中继承链伸展背部降下到对象“。
请参考以下链接https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
你给我的答案是正确的。 面试官是错误的:
内部流程
if suppose Class A Doesn't extends any other class
then ---> Class B extends java.lang.Object
then ---> Class A extends B
then class A also inherited the property of java 'Object' class...
所以,Java不支持多重继承。
如果您想验证这个过程只产生“的javadoc”为您的类A和验证结果。