JAVA中this关键字的用法以及举例
this 关键字在 Java 中主要用于以下几种情况:
1.引用当前对象的成员变量: 当成员变量与方法参数或局部变量同名时,使用 this 可以明确指示使用的是成员变量。
public class MyClass {
private int num;
public MyClass(int num) {
// 使用this关键字区分成员变量和构造方法参数
this.num = num;
}
}
2.调用当前对象的其他构造方法: 当一个构造方法需要调用同一个类中的另一个构造方法时,可以使用 this() 方法。
public class MyClass {
private int num;
public MyClass() {
this(0); // 调用另一个构造方法
}
public MyClass(int num) {
this.num = num;
}
}
3.返回当前对象的引用: 当一个方法需要返回当前对象的引用时,可以使用 return this。
public class MyClass {
private int num;
public MyClass setNum(int num) {
this.num = num;
return this; // 返回当前对象的引用
}
}
4.在匿名内部类中引用外部类的实例: 当在匿名内部类中需要引用外部类的实例时,可以使用 外部类名.this。
public class Outer {
private int value;
public void doSomething() {
// 匿名内部类中引用外部类的实例
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Value from outer class: " + Outer.this.value);
}
};
}
}
5.在链式调用中返回当前对象: 当一个方法需要支持链式调用时,可以在方法中返回 this。
public class MyClass {
private int num;
public MyClass setNum(int num) {
this.num = num;
return this; // 支持链式调用
}
}
这些是 this 关键字的常见用法,它们能够提高代码的可读性和清晰度,同时也能够解决一些特定的编程问题。
简单的例子:
假设我们有一个 Person 类,用于表示人的姓名和年龄。在构造方法中,我们接收姓名和年龄作为参数,并将它们赋值给类的成员变量。在 printInfo 方法中,我们打印出这个人的姓名和年龄。假设我们有一个 Person 类,用于表示人的姓名和年龄。在构造方法中,我们接收姓名和年龄作为参数,并将它们赋值给类的成员变量。在 printInfo 方法中,我们打印出这个人的姓名和年龄。
public class Person {
// 成员变量
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
// 使用this关键字区分成员变量和局部变量
this.name = name;
this.age = age;
}
// 打印姓名和年龄
public void printInfo() {
System.out.println("Name: " + this.name);
System.out.println("Age: " + this.age);
}
public static void main(String[] args) {
// 创建一个Person对象
Person person = new Person("Alice", 30);
// 调用printInfo方法
person.printInfo();
}
}
在上面的代码中,我们使用了 this 关键字来引用当前对象的成员变量 name 和 age。这样做是为了区分构造方法的参数 name 和 age 与成员变量的 name 和 age。
当我们创建 Person 对象时,我们向构造方法传递了姓名 “Alice” 和年龄 30。在构造方法内部,我们使用 this.name 和 this.age 来访问当前对象的成员变量,并将传递进来的值赋给它们。然后我们调用 printInfo 方法,打印出这个人的姓名和年龄。
这个例子展示了如何使用 this 关键字来引用当前对象的成员变量,以及它的作用是为了区分成员变量和局部变量。
为了方便大家理解我再来写一个复杂一点的例子
复杂的案列
假设我们有一个 Rectangle 类,用于表示矩形的宽度和高度,并且可以计算矩形的面积。我们还有一个 Box 类,表示一个立方体,它扩展自 Rectangle 类,并增加了一个长度属性。在 Box 类中,我们想要使用父类 Rectangle 中的方法来计算底部的矩形的面积,并在 Box 类中添加计算立方体体积的方法。
class Rectangle {
protected double width;
protected double height;
// 构造方法
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// 计算矩形的面积
public double calculateArea() {
return this.width * this.height;
}
}
class Box extends Rectangle {
private double length;
// 构造方法
public Box(double width, double height, double length) {
// 调用父类的构造方法
super(width, height);
this.length = length;
}
// 计算立方体的体积
public double calculateVolume() {
// 调用父类的方法来计算底部矩形的面积
double baseArea = super.calculateArea();
// 计算立方体的体积
return baseArea * this.length;
}
}
public class Main {
public static void main(String[] args) {
// 创建一个立方体对象
Box box = new Box(5, 4, 3);
// 计算并打印立方体的体积
System.out.println("Volume of the box: " + box.calculateVolume());
}
}