this
关键字
- 引用当前对象的属性或方法:
- 当你在一个类中编写方法,成员变量与局部变量同名时,
this
可以引用当前对象的属性或方法,以区分成员变量和局部变量。 - 示例:
public class Main {
String name;
public void setName(String name) {
this.name = name; // this.name 指的是Main类的name属性,而name指的是方法的参数
}
public String getName() {
return this.name; // 返回当前对象的name属性
}
}
- 当你在一个类中编写方法,成员变量与局部变量同名时,
- 在构造方法中调用另一个构造方法:
- 一个构造方法可以使用
this()
来调用同一个类的另一个构造方法。 - 注意:这一调用必须是构造方法中的第一条语句(除了注释和变量声明之外)。
- 示例:
public class Main {
double a, b;
public Main() {
this(1.0, 1.0); // 调用带有两个参数的构造方法
}
public Main(double a, double b) {
this.a = a;
this.b = b;
}
}
- 一个构造方法可以使用
- 返回当前对象的引用:
- 在某些情况下,
this
可以用作返回类型,以返回当前对象的引用。便于支持链式调用。
- 在某些情况下,
super
关键字
super
关键字在Java中用于访问父类的成员(包括变量、方法和构造方法)。
- 访问父类的成员(成员变量和方法):
- 当父类与子类有同名的成员时,可以使用
super
关键字访问父类的成员变量和方法。 - 也可以在子类中使用
super
关键字调用父类中被重写的方法。 - 示例:
class Main1 {
void eat() {
System.out.println("eating1");
}
}
class Main2 extends Main1 {
void eat() {
super.eat(); // 调用父类的eat方法
System.out.println("eating2");
}
}
- 当父类与子类有同名的成员时,可以使用
- 调用父类的构造方法:
- 在子类的构造方法中,
super()
用于调用父类的构造方法。这通常是必需的,特别是当父类没有无参构造方法时。 - 注意:
super()
调用必须是子类构造方法中的第一条语句(除了注释和变量声明之外)。 - 示例:
class Main1 {
Main1(String name) {
// 父类构造方法
}
}
class Main2 extends Main1 {
Main2(String name) {
super(name); // 调用父类的构造方法
// 其他初始化代码
}
}
- 在子类的构造方法中,
- 在接口继承中:
- 如果一个类实现了多个接口,并且这些接口中定义了相同的默认方法,那么子类可以通过接口名.super.方法名()的方式来明确调用特定接口的默认方法。
- 示例:
interface A {
default void show() {
System.out.println("A");
}
}
interface B {
default void show() {
System.out.println("B");
}
}
class Main implements A, B {
void show() {
A.super.show(); // 调用接口A的show方法
B.super.show(); // 调用接口B的show方法
}
}
this和super的关系
共同点
- 引用对象或类:this和super都用于在类的内部引用对象或类。
- 构造方法限制:this()和super()都只能出现在构造方法的第一条语句中,且不能同时出现在同一个构造方法中。此外,this和super都不能用于静态方法或静态代码块中,因为它们都依赖于对象实例。
使用场景
- 在构造方法中,this()和super()都用于调用其他构造方法。
区别
- 指代对象:
- this:指代当前对象。
- super:指代当前对象的直接父类。
- 用途差异:
- this:主要用于访问当前类的成员变量和方法,以及调用当前类的其他构造方法。
- super:主要用于访问父类的成员变量和方法,以及调用父类的构造方法。
- 使用限制:
- this()和super()都只能出现在构造方法的第一条语句中,且不能同时出现在同一个构造方法中。
- this和super都不能用于静态方法或静态代码块中,因为它们都依赖于对象实例。
注意事项
- 在使用this和super时,要确保它们引用的对象或类已经存在。例如,在调用父类的构造方法之前,父类必须已经被定义。
- 当子类与父类有同名的成员变量或方法时,可以使用this来引用子类的成员,使用super来引用父类的成员。
- 在构造方法中,如果没有显式地调用父类的构造方法,则会自动调用父类的无参构造方法(如果父类没有定义无参构造方法且子类的构造方法中没有显式调用父类的其他构造方法,则会导致编译错误)。