在 Java 中,super
关键字和this
关键字的区别如下:
一、指代对象不同
-
this
:- 代表当前对象的引用。即正在调用成员方法或构造方法的那个对象实例。
- 例如,在一个类的方法中,
this
可以用来引用当前对象的成员变量和方法。
-
super
:- 代表父类对象的引用。可以通过它来访问父类的成员变量、方法和构造方法。
二、用法不同
2.1 访问成员变量
this
:用于区分局部变量和成员变量,当方法中的局部变量与成员变量同名时,可以使用this.成员变量名
来访问成员变量。例如:
public class MyClass {
private int num;
public MyClass(int num) {
this.num = num;
}
}
super
:当子类和父类有同名成员变量时,可以使用super.成员变量名
来访问父类的成员变量。例如:
class Parent {
int num = 10;
}
class Child extends Parent {
int num = 20;
void print() {
System.out.println("Child's num: " + this.num);
System.out.println("Parent's num: " + super.num);
}
}
2.2 调用方法:
this
:可以使用this.方法名()
来调用当前类的其他方法。例如:
public class MyClass {
public void method1() {
System.out.println("Method 1");
this.method2();
}
public void method2() {
System.out.println("Method 2");
}
}
super
:可以使用super.方法名()
来调用父类被重写的方法。例如:
class Parent {
void show() {
System.out.println("Parent's show method");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child's show method");
super.show();
}
}
2.3 调用构造方法:
this
:在构造方法中,this()
用于调用同一类中的其他构造方法,且必须放在构造方法的第一行。例如:
public class MyClass {
private int num;
public MyClass() {
this(10);
}
public MyClass(int num) {
this.num = num;
}
}
super
:在子类的构造方法中,super()
用于调用父类的构造方法,且也必须放在构造方法的第一行。例如:
class Parent {
public Parent() {
System.out.println("Parent constructor");
}
}
class Child extends Parent {
public Child() {
super();
System.out.println("Child constructor");
}
}
三、使用场景不同
-
this
:- 通常用于解决成员变量的命名冲突、在一个类的内部方法之间进行调用等场景。
- 在构造方法中,用于区分参数名和成员变量名,并调用同一类的其他构造方法以实现代码复用。
-
super
:- 主要用于访问父类的成员变量和方法,尤其是在子类中需要调用父类被重写的方法或访问被隐藏的成员变量时。
- 在子类的构造方法中调用父类的构造方法,以确保父类的初始化工作先完成。