我什么时候使用super()?

时间:2010-11-03 19:25:15

标签: java inheritance super

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

编辑:
我找到了使用super.variable的代码示例:

class A
{
    int k = 10;
}

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

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

11 个答案:

答案 0 :(得分:134)

完全 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");
    }
}

答案 1 :(得分:41)

super用于调用父类的constructormethodsproperties

答案 2 :(得分: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();
    }
}

此处,行super.print()调用超类print()的{​​{1}}方法。输出将是:

CellPhone

答案 3 :(得分:9)

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

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

答案 4 :(得分:8)

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

例如:

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

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

构建TheSub的实例会同时调用eatCake()eatMoreCake()

答案 5 :(得分:1)

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

答案 6 :(得分:1)

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

来自oracle文档page

  

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

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

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

  

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

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

super();  

或:

super(parameter list);

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

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

相关文章:

Polymorphism vs Overriding vs Overloading

答案 10 :(得分:0)

我刚尝试过,评论了super();没有评论就像@Mark Peters所说的那样做同样的事情

async()