我正在处理一个扩展的类JFrame
。
super
这不是我的代码,它在开始构建 GUI 之前会调用它。我想知道为什么要这样做,因为我一直只是访问超类的方法而无需调用super();
我正在处理一个扩展的类JFrame
。
super
这不是我的代码,它在开始构建 GUI 之前会调用它。我想知道为什么要这样做,因为我一直只是访问超类的方法而无需调用super();
对于所有具有父类的类(即 Java 中的每个用户定义类),都有一个不带参数的隐式调用,super()
因此通常不需要显式调用它。但是,如果父的构造函数接受参数并且您希望指定它们,则可以使用带参数的调用。super()
此外,如果父类的构造函数带有参数,并且它没有默认的无参数构造函数,则需要使用参数调用super()
。
一个示例,其中显式调用super()
为您提供了对框架标题的一些额外控制:
class MyFrame extends JFrame
{
public MyFrame() {
super("My Window Title");
...
}
}
super()
当您不自己进行调用时,会自动调用父类的空构造函数。这就是您不必在代码中执行此操作的原因。它是为你完成的。
当您的超类没有无参数构造函数时,编译器将要求您super
使用适当的参数进行调用。编译器将确保您正确地实例化该类。所以这不是你必须过多担心的事情。
无论您是否调用super()
构造函数,它都不会影响您调用父类方法的能力。
作为旁注,有人说,为了清楚起见,通常最好手动进行调用。
我们可以使用 super 关键字访问超类元素
考虑我们有两个类,父类和子类,具有不同的方法 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();
}
}
它只是调用超类的默认构造函数。
我们使用 super 关键字来调用超类的成员。
由于子类从其父类继承所有成员(字段、方法、嵌套类),并且由于构造函数不是成员(它们不属于对象。它们负责创建对象),因此它们不会被子类继承。
因此,如果我们需要为超类创建对象,我们必须显式地调用父构造函数,以便构造函数链保持连接。在创建对象时,只能调用一个构造函数。通过 super,我们可以在需要时从当前构造函数中调用另一个构造函数。
如果您正在考虑为什么它存在于不扩展任何其他类的类,那么请记住默认情况下每个类都遵循对象类。因此,在构造函数中保留 super 是一个好习惯。
注意:即使您的第一条语句中没有 super(),编译器也会为您添加它!
我们可以使用 super 关键字访问超类成员
如果您的方法覆盖了其超类的方法之一,您可以通过使用关键字来调用被覆盖的方法super
。您也可以使用 super 来引用隐藏字段(尽管不鼓励隐藏字段)。考虑这个类,超类:
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 中的名称。因此,要引用printMethod()
继承自 Superclass,Subclass 必须使用限定名称,使用 super 如图所示。编译和执行子类打印以下内容:
Printed in Superclass.
Printed in Subclass