Java this关键字的3种用法(非常详细)
this 是 Java 的关键字之一,它其实是一个引用变量,指向当前对象,即通过类创建出的那个对象。
this 关键字的用法主要包含以下三种:
如果我们在构造方法中稍微改造一下,对两个属性都添加 this 关键字:
实际上,如果类的属性名和构造方法参数名不同时则可以省略 this。比如:
例如:
需要注意的是,必须是在构造方法中且在构造方法中的第一行代码就调用 this(),否则会报错,比如:
this 关键字的用法主要包含以下三种:
- 访问当前对象的属性;
- 调用当前对象的方法;
- 调用构造方法。
this访问当前对象的属性
this 最常见的用法是访问当前对象的属性,我们经常会在构造方法中看到通过 this 来对对象属性进行赋值的操作。我们来看一下假如不使用 this 会是什么情况,观察下面的实例程序:public class Worker { public int age; public String name; public Worker(int age, String name) { age = age; name = name; } public static void main(String[] args) { Worker xiaoming = new Worker(10,"xiaoming"); System.out.println(xiaoming.age); System.out.println(xiaoming.name); } }程序里的 Worker 类的构造方法中没有使用 this,然后创建一个“xiaoming”对象并输出该对象的属性值,结果是“0”和“null”。
如果我们在构造方法中稍微改造一下,对两个属性都添加 this 关键字:
public class Worker { ... public Worker(int age, String name) { this.age = age; this.name = name; } ... }此时再运行程序就可以看到输出结果为“10”和“xiaoming”。
实际上,如果类的属性名和构造方法参数名不同时则可以省略 this。比如:
public class Worker { ... public Worker(int age2, String name2) { age = age2; name = name2; } ... }同样的 Worker 类,我们将构造方法的参数名改为 age2 和 name2,那么不使用 this 就能够对当前对象的属性进行赋值,最终的输出结果为“10”和“xiaoming”。
this调用当前对象的方法
this 还有一个常见的用法是调用当前对象的方法,例如:public class Dog { public void run() { System.out.println("running..."); } public void bark() { System.out.println("barking..."); } public void runAdnBark() { this.run(); this.bark(); } }程序中的 Dog 类中定义了 run() 和 bark() 两个方法,那么可以在另一个方法 runAdnBark() 中通过 this.run() 和 this.bark() 来调用这两个方法。
实际上这里也可以省略 this 关键字,因为这种情况下编译器会帮我们自动加上 this。
this调用构造方法
我们还可以通过 this() 的方式在类的某个构造方法中调用另一个构造方法,这种方式能提升代码的重复使用率。例如:
public class Worker { public int age; public String name; public int height; public Worker(int age, String name) { this.age = age; this.name = name; } public Worker(int age, String name, int height) { this(age, name); this.height = height; } }比如程序中的 Worker 类共有 age、name 和 height 三个属性,如果已经定义好了包含参数 age 和 name 的构造方法,就可以在包含 age、name 和 height 三个参数的构造方法中通过 this(age, name) 来调用对应的构造方法,从而实现对 age 和 name 的赋值操作。
需要注意的是,必须是在构造方法中且在构造方法中的第一行代码就调用 this(),否则会报错,比如:
public class Worker { public int age; public String name; public int height; public Worker(int age, String name) { this.age = age; this.name = name; } public Worker(int age, String name, int height) { this.height = height; this(age, name); } }程序中将“this(age, name);”放到“this.height = height;”后面就会导致编译错误。