“超级”关键字指的是哪个类?

时间:2018-04-09 04:58:26

标签: java oop inheritance multiple-inheritance super

当使用多重继承时,关键字“super”引用哪个类,是否创建了第一个类?或者我们正在使用的子类的父类?

感谢您的考虑。

4 个答案:

答案 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)

  • super()指您班级的直系家长。
  • super()类应该是构造函数中的第一个语句。
  • 如果您的超类没有默认构造函数。你必须指定 与您的父类构造函数匹配的super()调用。

参考此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。如果实例成员或方法对子类不可见,则编译将失败。一个类从它的父类继承所有属性和行为。当我们覆盖子类中的行为并且仍然想要调用父类定义的行为时,该关键字非常有用。