我什么时候使用super()?

mut*_*y91 77 java inheritance super

我目前正在学习Java课程中的类继承,我不知道何时使用该super()调用?

编辑:
我发现了这个代码示例:super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我理解在这里,您必须使用super访问k超类中的变量.但是,在任何其他情况下,做super();什么?在其自己的?

Mar*_*ers 135

调用究竟 super()总是多余的.它明确地做了一些隐含的事情.那是因为如果省略对超级构造函数的调用,无论如何都会自动调用无参数的超级构造函数.不是说这是不好的风格; 有些人喜欢明白.

但是,当超级构造函数获取要从子类传入的参数时,它变得有用.

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @h8pathak:如果您要问子类如何绕过其父类的实现但调用祖父类,那在 Java 中是不可能的。 (3认同)
  • 假设一个方法在子类中被覆盖,然后在其子类中再次覆盖.(多级继承)如果我们必须同时将祖父母和父母的方法调用到孙子类中,该怎么办?如何使用超级? (2认同)

Zai*_*ikh 42

super是用来打电话的constructor,methodsproperties父类的.


小智 22

super当您想要在子类中重写方法时从父类调用方法时,也可以在子类中使用该关键字.

例:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,该行super.print()调用print()超类的方法CellPhone.输出将是:

I'm a cellphone
I'm a touch screen cellphone
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 9

当你想要调用超类构造函数时 - 初始化其中的字段.看看这篇文章,了解何时使用它:

http://download.oracle.com/javase/tutorial/java/IandI/super.html

  • 正如它在链接中所说,你永远不会*调用`super()`,因为Java将隐式添加它.但是如果你需要一个非默认的父构造函数,你必须调用`super(args)`. (4认同)

Tar*_*ama 8

您可以将它用作子类构造函数的第一行来调用其父类的构造函数.

例如:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}
Run Code Online (Sandbox Code Playgroud)

构造一个实例TheSub会调用eatCake()eatMoreCake()