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”,中文含义为“递归调用构造方法”。