繁体   English   中英

我什么时候使用 super()?

[英]When do I use super()?

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

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

class A
{
    int k = 10;
}

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

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

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

super用于调用父类的constructormethodsproperties

当您在子类中重写父类中的方法时,您也可以在子类中使用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()调用超类CellPhoneprint()方法。 输出将是:

I'm a cellphone
I'm a touch screen cellphone

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

例如:

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

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

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

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

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

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

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

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

从 oracle 文档 页面

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

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

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

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

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

super();  

或者:

super(parameter list);

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

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

相关帖子:

多态 vs 覆盖 vs 重载

我刚试了一下,评论 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();
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM