【问题标题】:Which class does "super" keyword refer to?“super”关键字指的是哪个类?
【发布时间】:2018-09-18 10:21:04
【问题描述】:

在使用多重继承时,关键字“super”指的是哪个类,第一个创建的类?还是我们正在使用的子类的父类?

感谢您的考虑。

【问题讨论】:

  • super() in Java的可能重复
  • Java 中没有多重继承。
  • @daniu 我不是指那种类型的继承,我只是指很多在链中派生的类..我不知道如何做出更恰当的陈述,因此是“多重继承”
  • The Java™ Tutorials - Using the Keyword super。很容易通过 网络搜索,也就是 research 找到。
  • Java 中不能进行多重继承。

标签: java oop inheritance multiple-inheritance super


【解决方案1】:

在继承链中,如果您在 D 类的实例上调用 super,该实例从 C 派生,而 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 的 super 是 C,没有找到 print,所以对 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

您可以通过接口进行某种多重继承。但是接口通常没有自己的代码实现,所以当你实现多个接口时,你只是在声明遵守一些约定。

实施必须由您自己完成(或明确委托)。但是这样做,您有责任自己解决冲突;没有自动解决它的机制。在此示例中,两种实现均按特定顺序调用。

【讨论】:

    【解决方案2】:
    • super() 指的是您的班级的直接父级。
    • super() 类应该是构造函数中的第一条语句。
    • 如果您的超类没有默认构造函数。你必须指定 super() 调用匹配你的父类构造函数。

    参考这个Link

    【讨论】:

      【解决方案3】:

      java中的super关键字是一个引用变量,用来引用父类对象。这在我们要调用父类方法时使用。因此,每当父类和子类具有相同的命名方法时,为了解决歧义,我们使用 super 关键字。这段代码 sn-p 有助于理解 super 关键字的上述用法。 假设我们有 2 个类,例如:

      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 指直接父类。 希望能帮助到你。 :)

      【讨论】:

        【解决方案4】:

        Java 支持线性继承。这可以是多个级别,但它不支持从多个直接父类派生的类。

        现在假设有一个下面的类层次结构。

        classes : A, B, C
        hierarchy :  C extends B, B extends A.
        

        当我们在 C 中定义的任何实例方法(或实例块)中使用 super 关键字时,它指的是 immediate 父级的实例成员和字段。如果用在C中表示它引用B的实例成员或字段,如果用在B中表示它引用A的实例成员或字段,如果用在A中表示它引用Object.java的实例成员或字段

        对于调用直接父类的特定构造函数super,也可以在子类的构造函数中使用,条件是它应该是第一个语句。

        附:如果实例成员或方法对子类不可见,则编译将失败。一个类继承了它的父类的所有属性和行为。当我们覆盖子类中的行为但仍想调用父类定义的行为时,该关键字很有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多