我正在处理一个扩展JFrame
的课程。
它不是我的代码,它在开始构建GUI之前调用super
。我想知道为什么要这样做,因为我总是只是访问超类的方法而不必调用super();
答案 0 :(得分:88)
对super()
的隐式调用没有所有具有父级的类的参数 - 这是Java中的每个用户定义的类 - 因此通常不需要显式调用它。但是,如果父的构造函数接受参数,并且您希望指定它们,那么可能使用带有参数的super()
调用。此外,如果父的构造函数接受参数,并且它没有默认的无参数构造函数,则需要使用参数调用super()
。
一个例子,显式调用super()
可以对帧的标题进行一些额外的控制:
class MyFrame extends JFrame
{
public MyFrame() {
super("My Window Title");
...
}
}
答案 1 :(得分:18)
如果您不自行完成对父类的空构造函数super()
的调用,则会自动完成。这就是你从未在代码中做到这一点的原因。这是为你完成的。
当您的超类没有no-arg构造函数时,编译器将要求您使用适当的参数调用super
。编译器将确保您正确地实例化该类。所以这不是你必须担心的事情。
无论你是否在构造函数中调用super()
,它都不会影响你调用父类方法的能力。
作为旁注,有人说为了清晰起见,通常最好手动拨打电话。
答案 2 :(得分:2)
我们可以使用超级方法
访问超类元素考虑我们有两个类,Parent类和Child类,以及方法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();
}
}
答案 3 :(得分:1)
它只是调用超类的默认构造函数。
答案 4 :(得分:0)
我们可以使用super()
访问SuperClass成员如果您的方法覆盖了其超类的方法之一,则可以通过使用关键字super
来调用重写方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)。考虑这个类,Superclass:
public class Superclass {
public void printMethod() {
System.out.println("Printed in Superclass.");
}
}
//这是一个名为Subclass的子类,它覆盖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();
}
}
在Subclass中,简单名printMethod()
是指在Subclass中声明的名称,它会覆盖Superclass中的名称。因此,要引用继承自Superclass的printMethod()
,Subclass必须使用限定名,使用super,如图所示。编译和执行Subclass将打印以下内容:
Printed in Superclass.
Printed in Subclass
答案 5 :(得分:0)
以上答案都没有回答“为什么”。找到了一个很好的解释here:
<块引用>子类可以有自己的私有数据成员,所以子类可以 也有自己的构造函数。
子类的构造函数只能初始化实例 子类的变量。因此,当子类对象是 实例化的子类对象也必须自动执行一个 超类的构造函数。
干杯
答案 6 :(得分:0)
我们使用 super 关键字来调用超类的成员。
由于子类从其父类继承了所有成员(字段、方法、嵌套类),并且由于构造函数不是成员(它们不属于对象。它们负责创建对象),因此它们不会被子类继承.
因此,如果我们需要为超类创建对象,我们必须显式调用父构造函数,以便构造函数链保持连接。在创建对象时,只能调用一个构造函数。通过 super,我们可以在需要时从当前构造函数内部调用另一个构造函数。
如果您在想为什么它存在于一个不扩展任何其他类的类中,那么请记住默认情况下每个类都遵循对象类。因此,在构造函数中保留 super 是一个好习惯。
注意:即使你的第一条语句中没有 super(),编译器也会为你添加它!