Java不支持多重继承。其中一个原因是在继承时方法之间可能存在歧义。例如,在下面的场景中,对于哪个版本的" LevelMethod()"将存在歧义。应该在Class“Level3”中继承
class Level1{
public void LevelMethod(){
System.out.println("Level1 method");
}
}
class Level2{
public void LevelMethod(){
System.out.println("Level2 method");
}
}
class Level3 extends Level1,Level2{
}
但是,在以下场景中可能会出现同样的歧义,通过多级继承,对于哪个版本的" LevelMethod()"应该继承在 “Level4”等级。
class Level1{
public void LevelMethod(){
System.out.println("Level1 method");
}
}
class Level2 extends Level1{
public void LevelMethod(){
System.out.println("Level2 method");
}
}
class Level3 extends Level2{
public void LevelMethod(){
System.out.println("Level3 method");
}
}
class Level4 extends Level3{
}
java如何解决多级继承中的歧义,但不能在多重继承中解决歧义?
答案 0 :(得分:2)
当没有解决冲突的机制时,存在歧义。 在单继承上,子项覆盖其父项上的方法,方法查找具有明确的解决方案,没有冲突,因为有订单。
经典多重继承未指定冲突解决机制,因此出现diamond problem。
答案 1 :(得分:0)
继承层次结构中调用的方法取决于对象类型。每个子类都覆盖父级" levelMethod"。
尝试一些例子
var tabs = [{
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": ""
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": ""
}]
}, {
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer"
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": "Some Still Different Answer"
}]
}];
tabs.forEach(tab => {
tab['QUESTIONS'].forEach(question => {
if (question['ANSWER']) {
question['HAS_ANSWER'] = 1;
}
});
});
console.log(tabs);
依旧......
答案 2 :(得分:0)
java中的对象只是简单的引用。因此,具有is-a关系的两个或多个类是否具有相同的方法并不重要,因为它将取决于哪个对象调用该方法,因为引用将是不同的(由其hashCode标识)。在您的给定代码中,如果Level 2的对象调用方法LevelMethod()
,则引用类Level 2的上下文,因此显然Java将解释来自Level 2的LevelMethod()
的结果。
但是,由于超类的对象可以引用子类的对象,因此在调用LevelMethod()
时,您需要指定哪个类。
如果您想证明引用不同,请执行以下程序:
class A{
public void cmethod(){
System.out.println("Class A");
}
}
class B extends A{
public void cmethod(){
System.out.println("Class B");
}
}
class C extends B{
public void cmethod(){
System.out.println("Class C");
}
}
class MainClass{
public static void main(String[] args){
A aObj = new A();
B bObj = new B();
C cObj = new C();
System.out.println(aObj.toString());
System.out.println(bObj.toString());
System.out.println(cObj.toString());
}
}
说明:如果您创建自己的类并且不重写方法toString(),那么Object
类将调用它的默认toString()
方法,该方法显示Class@refHashCode
(所有类都是类Object
)的子类。