当使用多重继承时,关键字“super”引用哪个类,是否创建了第一个类?或者我们正在使用的子类的父类?
感谢您的考虑。
答案 0 :(得分:3)
在继承链中,如果在类D的实例上调用super,它是从C派生的,它本身是从B派生而来自A,则对super的调用将转到直接父级。如果在那里找不到方法,那么父母的链条就会爬上去:
class A {
void print () { System.out.println ("from A"); }
}
class B extends A {
void print () { System.out.println ("from B"); }
}
class C extends B {
// no own print method
}
class D extends C {
void print () { super.print (); }
}
D d = new D ();
d.print ();
所以在这里,D的超级是C,没有找到打印,因此对B进行查找,就像调用C.print()一样。找到了一个用于执行操作的具体实现。
from B
这通常不称为多重继承,但如果您派生自多个父级,那么您无法使用Java。您可以使用其方法实现多个接口,并且大多数情况下,它们的名称不在命名冲突中。
示例:
interface RocknRoller {
void roll ();
}
interface Gambler {
void roll ();
}
class Dice implements Gambler {
public void roll () { System.out.println ("roll a dice"); }
}
class Harrisson implements RocknRoller {
public void roll () { System.out.println ("while my guitar gently weeps"); }
}
class E extends D implements RocknRoller, Gambler {
RocknRoller rr = new Harrisson ();
Gambler g = new Dice ();
public void roll () {
rr.roll ();
g.roll ();
}
}
-> E e = new E ();
| Added variable e of type E with initial value E@47ef968d
-> e.roll ()
while my guitar gently weeps
roll a dice
您可以通过接口进行某种多重继承。但是界面通常没有自己的代码实现,所以当你实现多个接口时,你只是声明符合某个合同。
实施必须由您自己完成(或明确委托)。但通过这样做,你自己负责解决冲突;没有机制可以自动解决。在此示例中,两个实现都以特定顺序调用。
答案 1 :(得分:2)
参考此Link
答案 2 :(得分:1)
java中的super关键字是一个引用变量,用于引用父类对象。当我们想要调用父类方法时使用它。因此,只要父类和子类具有相同的命名方法然后解决歧义,我们就使用super关键字。此代码段有助于理解super关键字的上述用法。 假设我们有两个类,如:
class Parent {
String a ="parent string";
}
class Child extends Parent{
String a= "child string";
void show(){
System.out.println(a);
System.out.println(super.a);
}
}
public class Sample{
public static void main(String []args){
Child c= new Child();
c.show();
}
}
现在输出将是:
child string
parent string
简单a
指的是子类。
super.a
指的是直接父类。
希望能帮助到你。 :)
答案 3 :(得分:0)
Java支持线性继承。这可以是多个级别,但它不支持从多个直接父类派生的类。
现在假设有一个以下的类层次结构。
classes : A, B, C
hierarchy : C extends B, B extends A.
当在C中定义的任何实例方法(或实例块)内部使用super
关键字时,它指的是 immediate parent的实例成员和字段。如果在C中使用它意味着它引用B的实例成员或字段,如果在B中使用它意味着它引用A的实例成员或字段,如果在A中使用它意味着它引用实例成员或Object.java字段
同样,对于调用直接父类super
的特定构造函数,可以在子类的构造函数中使用,条件是它应该是第一个语句。
P.S。如果实例成员或方法对子类不可见,则编译将失败。一个类从它的父类继承所有属性和行为。当我们覆盖子类中的行为并且仍然想要调用父类定义的行为时,该关键字非常有用。