首页 > 编程笔记 > Java笔记 阅读:12

Java this关键字的3种用法(非常详细,附带实例)

类在定义成员方法时,局部变量和成员变量可以重名,但此时不能访问成员变量。为了避免这种情形,Java 提供了 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

实例化对象时,调用了两个参数的构造方法,在该构造方法中通过 this(name) 调用了带一个参数的构造方法。因此,运行结果中显示两个构造方法都被调用了。

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

相关文章