我什么时候使用super()?
我目前正在学习Java课程中的类inheritance,我不明白何时使用super()
调用?
编辑:
我发现这个代码的例子super. variable
super. variable
被使用:
class A { int k = 10; } class Test extends A { public void m() { System.out.println(super.k); } }
所以我明白,在这里,你必须使用super
来访问超类中的k
variables。 但是,在其他情况下, super();
是什么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()
行super.print()
调用超类CellPhone
的print()
方法。 输出将是:
I'm a cellphone I'm a touch screen cellphone
当你想要调用超类的构造函数时 – 初始化其中的字段。 看看这篇文章,了解何时使用它:
http://download.oracle.com/javase/tutorial/java/IandI/super.html
你可以使用它作为子类构造函数的第一行来调用其父类的构造函数。
例如:
public class TheSuper{ public TheSuper(){ eatCake(); } } public class TheSub extends TheSuper{ public TheSub(){ super(); eatMoreCake(); } }
构造一个TheSub
的实例将调用eatCake()
和eatMoreCake()
你可以用它来调用一个超类的方法(比如当你重写这样一个方法时,super.foo()等) – 这将允许你保持这个function,并添加到它与任何你在被覆盖方法。
超级会打电话给你父母的方法。 请参阅: http : //leepoint.net/notes-java/oop/constructors/constructor-super.html
你可以调用super()
来专门运行你的超类的构造函数。 考虑到一个类可以有多个构造函数,你可以使用super()
或者super(param,param)
或者super(param,param)
来调用特定的构造函数super(param,param)
你可以让Java处理它并调用标准的构造函数。 请记住,遵循类层次结构的类遵循“是 – 一个”关系。
你的子类的构造函数的第一行必须是对super()
的调用,以确保调用super()
类的构造函数。
我只是试了一下,评论super(); 做同样的事情没有评论@马克·彼得斯说
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(); } }
从oracle文档页面 :
如果你的方法覆盖了它的一个超类的方法,你可以通过使用关键字
super
调用重写的方法。
你也可以使用super
来引用一个隐藏的字段(虽然不鼓励隐藏字段)。
在子类的构造函数中使用super
:
调用超类的构造函数必须是子类构造函数的第一行。
调用超类构造函数的语法是
super();
要么:
super(parameter list);
用super()
,超类无参数的构造函数被调用。 用super(parameter list)
,调用具有匹配参数列表的超类构造函数。
注意: 如果构造函数没有显式地调用超类构造函数,那么Java编译器会自动插入对超类的无参构造函数的调用 。 如果超类没有没有参数的构造函数,你会得到一个编译时错误。
相关文章:
多态vs覆盖vs重载