super 关键字的作用?
参考回答
super
是 Java 中的一个关键字,用于引用父类的成员(包括属性、方法、构造方法),可以在子类中调用父类的构造方法或访问父类的成员。
主要作用有以下几点:
- 调用父类的构造方法。
- 调用父类的成员变量。
- 调用父类的方法。
详细讲解与拓展
1. super
调用父类的构造方法
在子类的构造方法中,super()
用于显式调用父类的构造方法。
- 如果子类构造方法中没有显式调用
super()
或this()
,Java 会默认调用父类的无参构造方法。 - 如果父类没有无参构造方法,则子类必须显式调用父类的带参构造方法。
示例 1:父类有无参构造方法
class Parent {
public Parent() {
System.out.println("Parent's no-arg constructor");
}
}
class Child extends Parent {
public Child() {
super(); // 默认调用父类无参构造方法
System.out.println("Child's constructor");
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
}
}
输出:
Parent's no-arg constructor
Child's constructor
示例 2:父类只有带参构造方法
class Parent {
public Parent(String name) {
System.out.println("Parent's constructor: " + name);
}
}
class Child extends Parent {
public Child() {
super("Alice"); // 必须显式调用父类构造方法
System.out.println("Child's constructor");
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
}
}
输出:
Parent's constructor: Alice
Child's constructor
2. super
调用父类的成员变量
- 如果子类和父类有同名的成员变量,可以使用
super
来访问父类的成员变量。 - 如果没有使用
super
,则默认访问的是子类的成员变量。
示例:
class Parent {
public String name = "Parent";
}
class Child extends Parent {
public String name = "Child";
public void displayNames() {
System.out.println("Child name: " + name); // 访问子类的 name
System.out.println("Parent name: " + super.name); // 访问父类的 name
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.displayNames();
}
}
输出:
Child name: Child
Parent name: Parent
3. super
调用父类的方法
- 如果子类重写了父类的方法,可以通过
super
调用被重写的父类方法。 - 如果没有使用
super
,则默认调用的是子类的重写方法。
示例:
class Parent {
public void display() {
System.out.println("Parent's display method");
}
}
class Child extends Parent {
@Override
public void display() {
System.out.println("Child's display method");
}
public void show() {
display(); // 调用子类的 display 方法
super.display(); // 调用父类的 display 方法
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.show();
}
}
输出:
Child's display method
Parent's display method
4. super
的限制
- 必须是子类方法或构造方法中使用:
- 不能在静态方法中使用
super
,因为静态方法属于类,而super
是针对实例的。错误示例:
class Parent { public void display() {} } class Child extends Parent { public static void staticMethod() { super.display(); // 编译错误 } }
- 必须是构造方法的第一行调用:
- 在子类构造方法中调用父类构造方法时,
super()
必须是构造方法的第一行。错误示例:
class Parent { public Parent(String name) {} } class Child extends Parent { public Child() { System.out.println("Before super"); // 编译错误 super("Alice"); } }
- 不能用于调用祖父类的成员:
super
只能直接访问父类的成员,不能访问祖父类的成员。
5. 拓展知识
this
与super
的对比
特性 | this |
super |
---|---|---|
作用域 | 当前类 | 父类 |
调用构造方法 | 调用当前类的其他构造方法 | 调用父类的构造方法 |
调用成员变量 | 当前类的成员变量 | 父类的成员变量 |
调用方法 | 当前类的方法 | 父类的方法 |
super
的使用场景- 访问被隐藏的父类成员变量:当子类与父类有同名变量时。
- 调用被重写的父类方法:当子类重写了父类方法时。
- 初始化父类部分:在子类构造方法中调用父类构造方法。
6. 总结
super
是 Java 中用于访问父类成员(属性、方法、构造方法)的关键字。-
主要作用:
- 显式调用父类的构造方法。
- 访问父类的成员变量(尤其是被子类隐藏的变量)。
- 调用父类的方法(尤其是被子类重写的方法)。
- 注意事项:
- 在构造方法中,
super()
必须是第一行。 - 不能在静态方法中使用
super
。
- 在构造方法中,
-
super
是继承体系中处理父类与子类关系的重要工具。