85

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

编辑:
我发现这个代码示例在哪里使用:super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

所以我明白,在这里,你必须使用super来访问k超类中的变量。但是,在任何其他情况下,它会super();做什么?在其自己的?

4

11 回答 11

148

准确 调用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");
    }
}
于 2010-11-03T19:37:49.663 回答
45

super用于调用父类的constructor,methodsproperties

于 2010-11-03T19:33:42.120 回答
25

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();
    }
}

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

I'm a cellphone
I'm a touch screen cellphone
于 2013-03-08T19:20:13.320 回答
11

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

例如:

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

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

构造一个实例TheSub将同时调用eatCake()eatMoreCake()

于 2010-11-03T19:29:31.260 回答
9

当您希望调用超类构造函数时 - 初始化其中的字段。查看这篇文章以了解何时使用它:

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

于 2010-11-03T19:28:48.790 回答
1

您可以使用它来调用超类的方法(例如,当您覆盖这样的方法时, super.foo() 等) - 这将允许您保留该功能并添加您在覆盖中的任何其他内容方法。

于 2010-11-03T19:28:08.523 回答
1

Super 会调用你的父方法。见: http: //leepoint.net/notes-java/oop/constructors/constructor-super.html

于 2010-11-03T19:28:18.500 回答
1

您调用super()专门运行超类的构造函数。鉴于一个类可以有多个构造函数,您可以使用super()或调用特定的构造函数,或者super(param,param)您可以让 Java 处理它并调用标准构造函数。请记住,遵循类层次结构的类遵循“is-a”关系。

于 2010-11-03T19:30:01.200 回答
0

您的子类构造函数的第一行必须是一个调用,super()以确保调用超类的构造函数。

于 2010-11-03T19:28:35.020 回答
0

从 oracle 文档页面

如果您的方法覆盖了其超类的方法之一,您可以通过使用关键字来调用被覆盖的方法super

您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)。

super在子类的构造函数中使用:

调用超类构造函数必须是子类构造函数的第一行。

调用超类构造函数的语法是

super();  

或者:

super(parameter list);

使用super(),调用超类无参数构造函数。使用super(parameter list),调用具有匹配参数列表的超类构造函数。

注意:如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。

相关帖子:

多态性 vs 覆盖 vs 重载

于 2016-10-02T12:29:50.513 回答
0

我刚试过,评论 super(); 做同样的事情而不像@Mark Peters所说的那样评论它

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}
于 2016-10-19T09:11:21.610 回答