[英]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
用于调用父类的constructor
、 methods
和properties
。
当您在子类中重写父类中的方法时,您也可以在子类中使用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()
调用超类CellPhone
的print()
方法。 输出将是:
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 编译器会自动插入对超类的无参数构造函数的调用。 如果超类没有无参数构造函数,则会出现编译时错误。
相关帖子:
我刚试了一下,评论 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.