回答
有一个隐含的调用super()
没有参数的所有类有一个父 - 这是每个用户定义在Java类 - 所以明确调用通常不是必需的。但是,如果父项的构造函数接受参数,并且希望指定它们,则可能会使用带有参数的super()
调用。此外,如果父类的构造需要的参数,它有没有默认参数的构造函数,你会需要调用super()
与参数(S)。
一个例子,在那里super()
显式调用使您能够框架的标题一些额外的控制:
class MyFrame extends JFrame
{
public MyFrame() {
super("My Window Title");
...
}
}
_也很重要:_superclass_构造函数的调用**必须是_subclass_构造函数中的第一行**。相关信息在这里:[为什么this()和super()必须是构造函数中的第一条语句?](https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-在构造函数中的第一个语句) – informatik01
当你不自己做时,调用父类的空构造函数super()
会自动完成。这就是你在代码中从来不需要这样做的原因。它是为你完成的。
当你的超没有一个无参数的构造函数,编译器将需要向super
使用适当的参数。编译器将确保您正确地实例化类。所以这不是你必须担心的事。
无论你叫super()
在构造函数或没有,它不会影响你打电话给你的父类的方法能力。
作为一个侧面说明,有人说,这是一般最好手动打这通电话为了清楚起见。
另外,请注意,当需要传递参数给它时,需要显式调用'super()'。 –
@SamDufel良好的通话,看我的编辑。 –
我们可以使用超()
如果你的方法来访问父类成员覆盖其超类方法之一,则可以通过使用关键字super
来调用重写的方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)。考虑这个类,超类:
public class Superclass {
public void printMethod() {
System.out.println("Printed in Superclass.");
}
}
//这里是一个子类,称为子类,重写printMethod()
:
public class Subclass extends Superclass {
// overrides printMethod in Superclass
public void printMethod() {
super.printMethod();
System.out.println("Printed in Subclass");
}
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
在子类中,简单名称printMethod()
是指一个子类中,声明其覆盖超类中的一个。因此,要引用从超类继承的printMethod()
,Subclass必须使用限定名称,如图所示使用super。编译和执行子类打印以下内容:
Printed in Superclass.
Printed in Subclass
第一句话是不正确的,而且这些都不能回答这个问题。 – EJP
我们可以通过使用超级方法
考虑,我们有两个类,父类和子类,与foo方法的不同实现访问超类的元素。现在在子类中,如果我们想调用父类的方法foo,我们可以通过super.foo()来实现。我们也可以通过super()方法访问父元素。
class parent {
String str="I am parent";
//method of parent Class
public void foo() {
System.out.println("Hello World " + str);
}
}
class child extends parent {
String str="I am child";
// different foo implementation in child Class
public void foo() {
System.out.println("Hello World "+str);
}
// calling the foo method of parent class
public void parentClassFoo(){
super.foo();
}
// changing the value of str in parent class and calling the foo method of parent class
public void parentClassFooStr(){
super.str="parent string changed";
super.foo();
}
}
public class Main{
public static void main(String args[]) {
child obj = new child();
obj.foo();
obj.parentClassFoo();
obj.parentClassFooStr();
}
}
- 1. 什么时候需要从构造函数调用`super`?
- 2. 为什么在Objective C构造函数中使用[super init]?
- 3. 为什么我调用super()在Java构造函数被标记为错误?
- 4. 为什么在调用复制构造函数之前调用构造函数?
- 5. 为什么调用基构造函数?
- 6. 在Java类中具有super()和不具有super()函数调用的构造函数之间有什么区别
- 7. super()在构造函数中的含义是什么?
- 8. 为什么JAVA需要构造函数?
- 9. 根据参数在构造函数中调用不同的super()
- 10. 构造函数super()es6 angularjs
- 11. 为什么不能在构造函数中同时使用this()和super()?
- 12. C++为什么要调用复制构造函数?
- 13. 在Java中调用super的构造函数声明
- 14. 您是否将super()调用作为构造函数的开始?
- 15. 为什么allocator在构造函数中?
- 16. 为什么要将原型的构造函数设置为其构造函数?
- 17. 为什么构造函数中需要apply()函数
- 18. 为什么没有在fill_n中调用移动构造函数
- 19. 为什么在非MonoBehaviour类中调用多个构造函数?
- 20. 为什么在虚拟继承中调用Default构造函数?
- 21. 为什么调用复制构造函数而不是移动构造函数?
- 22. 为什么我们需要在MSIL中显式调用父构造函数?
- 23. 为什么我们需要在JavaScript中调用父构造函数继承
- 24. 用super构造函数初始化()
- 25. 为什么要在类的构造函数中声明变量?
- 26. 为什么要调用析构函数,但在将对象作为参数传递时不会调用构造?
- 27. 为什么Swift构造函数使用命名参数调用?
- 28. 为什么不调用主类中的默认构造函数?
- 29. 为什么在这里调用复制构造函数?
- 30. 为什么在静态转换之后调用构造函数?
备注:扩展'JFrame'可能不是你想要做的。扩展意味着一种关系。除非你正在创建一个新的窗口组件,否则你应该扩展'JComponent'。 – Jeffrey