Java中super的多种用法及与this的区别
在Java编程语言中,super
关键字用于引用当前对象的父类实例,主要用于访问父类的成员变量和方法。将深入探讨super
的几种用法,并对比this
关键字的区别。
- 调用父类构造器:当子类创建一个新实例时,如果需要调用父类构造器,必须在子类构造函数的第一行使用
super()
,如下面的Base
和Checket
类所示。这是因为子类构造器首先执行父类的构造器,确保父类的状态正确初始化。如果不在首行放置super()
,编译器会报错,因为父类的构造器必须是子类构造器的第一个动作。
class Base {
Base() {
System.out.println("Base");
}
}
public class Checket extends Base {
Checket() {
super(); // 必须放在首位调用父类构造器
System.out.println("Checket");
}
public static void main(String[] args) {
Checket c = new Checket();
}
}
- 访问被隐藏的父类成员:当子类和父类有同名的成员变量或方法时,子类的方法会覆盖父类的同名方法,成员变量则会隐藏父类的成员。这时,使用
super
关键字可以显式地访问父类的成员。例如:
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Hefei";
super.value(); // 访问父类的value方法
System.out.println(name);
System.out.println(super.name); // 访问父类的name成员变量
}
public static void main(String[] args) {
City c = new City();
c.value();
}
}
- 调用父类的覆盖方法:如果子类重写了父类的方法,但仍然需要调用父类的实现,可以使用
super
关键字。需要注意的是,super
不能用于调用非覆盖的父类方法,只能用于访问已被覆盖的父类方法。例如:
class Country {
String name = "xianfan";
String value(String name) {
name = "China";
return name;
}
}
class City extends Country {
String name;
String value(String name) {
name = "Hefei";
super.value("失败"); // 调用父类的value方法
System.out.println(name);
System.out.println(super.name);
return name;
}
public static void main(String[] args) {
City c = new City();
c.value("成功");
}
}
- 传递参数给父类构造器:
super
还可以用于在子类构造器中传递参数给父类的有参构造器,确保父类实例的初始化:
class Person {
public static void prt(String s) {
System.out.println(s);
}
Person() {
prt("A Person.");
}
Person(String name) {
prt("A person name is: " + name);
}
}
public class Student extends Person {
String name;
Student(String name) {
super(name); // 传递参数给父类的构造器
this.name = name;
}
public static void main(String[] args) {
Student s = new Student("John Doe");
}
}
总结起来,super关键字在Java中主要扮演以下角色:
- 调用父类的构造器。
- 访问父类被隐藏的成员变量和方法。
- 调用父类已被覆盖的方法。
- 传递参数给父类的有参构造器。
而this
关键字则用于引用当前对象自身,常用于构造器之间调用、访问当前对象的成员变量等。super
和this
的区别在于前者指向父类,后者指向当前类实例。
57.5KB
文件大小:
评论区