Java this关键字的3种用法(非常详细,附带实例)
类在定义成员方法时,局部变量和成员变量可以重名,但此时不能访问成员变量。为了避免这种情形,Java 提供了 this 关键字,表示当前对象,指向调用的对象本身。
下面,我们综合演示 this 关键字调用成员变量、成员方法、构造方法。
举个简单的例子:
Java this的3种用法
this 关键字在程序中主要有 3 种用法,下面来分别讲解。1) this关键字调用成员变量
通过 this 关键字调用成员变量,可以解决与局部变量名称冲突的问题。请看下述示例代码:
class Dog {
int age; // 成员变量age
public Dog(int age) { // 局部变量age
this.age = age; // 将局部变量age的值赋给成员变量age
}
}
在上面的代码中,构造方法的参数 age 是一个局部变量,Dog 类还定义了一个成员变量,名称也是 age。在构造方法中,如果使用 age,则是访问局部变量,但如果使用 this.age 则是访问成员变量。2) this关键字调用成员方法
可以通过 this 关键字调用成员方法,具体示例代码如下:
class Dog {
public void openMouth() { // 方法的代码块
...
}
public void eat() {
this.openMouth();
}
}
在上面的代码中,eat() 方法使用 this 关键字调用了 openMouth() 方法。需要注意的是,此处的 this 关键字可以省略不写。3) this关键字调用构造方法
构造方法是在实例化对象时被 Java 虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在一个构造方法中使用“this([参数1,参数2…])”的形式来调用其他的构造方法。下面,我们综合演示 this 关键字调用成员变量、成员方法、构造方法。
举个简单的例子:
class Dog {
private String name; // 声明名字私有属性
private int age; // 声明年龄私有属性
public Dog() {
System.out.println("调用无参构造方法");
}
public Dog(String name) {
this.name = name;
System.out.println("调用带一个参数的构造方法");
}
public Dog(String name, int age) {
this(name);
System.out.println("调用两个参数的构造方法");
this.age = age; // 明确表示为类中的age属性赋值
}
public void testShow() {
System.out.println("使用this调用成员方法");
this.show();
}
public void show() { // 定义显示信息的方法
System.out.println("名字是" + this.name + ", 年龄: " + this.age);
}
}
public class Demo {
public static void main(String[] args) {
Dog dog = new Dog("旺财", 6);
dog.testShow();
}
}
程序的运行结果如下:
调用带一个参数的构造方法
调用两个参数的构造方法
使用this调用成员方法
名字是旺财,年龄:6
Java this关键字调用构造方法的常见错误
在使用 this 调用构造方法时,还需注意以下常见错误。1) this关键字调用构造方法的位置不当
在构造方法中,使用 this 调用构造方法的语句必须位于首行,且只能出现一次,如果将 this 语句放到代码最后面,程序将报错。例如:
public Dog(String name, int age) {
System.out.println("调用有参构造函数");
this.name = name; // 明确表示为类中的name属性赋值
this.age = age; // 明确表示为类中的age属性赋值
this(); // 调用无参构造方法
}
编译报错,并提示“Call to 'this()' must be first statement in constructor body”,中文含义为“对 this 的调用必须是构造器中的第 1 个语句”。因此,使用 this 调用构造方法的语句必须位于构造方法的首行。2) 两个构造方法中使用this关键字互相调用
不能在一个类的两个构造方法中使用 this 互相调用,例如:
class Dog {
public Dog() {
this(6); // 调用有参的构造方法
System.out.println("无参的构造方法被调用了");
}
public Dog(int age) {
this(); // 调用无参的构造方法
System.out.println("有参的构造方法被调用了");
}
}
编译报错,并提示“Recursive constructor invocation”,中文含义为“递归调用构造方法”。
ICP备案:
公安联网备案: