Java中this关键字的用途
- this.成员
- this.成员变量
- this.成员方法
- this()
Java中this关键字被解释为:“指向当前对象”,这个解释非常精炼且准确。
那么它的使用场景有哪些呢?
this.成员
this.成员变量
我们最常见到它的地方:
在构造器中给成员变量赋值的时候。
package com.example.duohoob.test;
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
// set、get方法省略...
}
这里要说一点:
User user = new User("username", "password");
通过new创建对象时会分三步,
一、申请分配内存并且给成员变量赋默认值;
二、调用构造方法并且给成员变量赋初始值;
三、建立起引用与内存地址的关联。
所以在构造方法中使用this指向当前对象的说法没毛病。
这里为什么要使用this?
我们把构造方法修改一下:把’this.'去掉,
package com.example.duohoob.test;
public class User {
private String username;
private String password;
public User(String username, String password) {
username = username;
password = password;
}
public void introduce() {
System.out.println("my name is " + username);
}
public static void main(String[] args) {
User user = new User("yw", "password");
user.introduce();
}
}
试试看。
试了,这里构造方法的参数username:'yw’并没有赋值给user对象的username属性,
因为在这里重名的情况下,局部变量的优先级更高,构造方法的参数username的值’yw’赋值给了它自己。
this.username解释为当前对象的username属性。
this.成员方法
package com.example.duohoob.test;
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public void hello() {
System.out.println("hello,");
}
public void introduce() {
this.hello();
// hello(); // 此时的this可以省略不写
System.out.println("my name is " + username);
}
public static void main(String[] args) {
User user = new User("yw", "password");
user.introduce();
}
}
这里this关键字可以省略。
this()
this()用来在构造方法中调用其它的构造方法。
package com.example.duohoob.test;
public class User {
private String username;
private String password;
private Integer age;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User(String username, String password, Integer age) {
this(username, password);
this.age = age;
}
public void introduce() {
System.out.println("my name is " + username + " age is " + age);
}
public static void main(String[] args) {
User user = new User("yw", "password", 21);
user.introduce();
}
}
先交代一下历史背景
Java构造方法与类名相同,
并且Java可以定义与类名相同的成员方法,甚至参数可以与构造方法相同,
区别是普通方法需要定义返回值类型。(当然可能没人会这么干)
定义的时候是区分开了,那么调用时候呢?
Java支持不声明返回值的方法调用,
怎么区分调用的是构造方法还是成员方法,
Java判断的依据是是否出现了new关键字,
出现了就是构造方法,没有则是成员方法。
那我想在构造方法中调用其它的构造方法怎么办,
不能new出来一个对象吧,这时候this()就出现了。
package com.example.duohoob.test;
public class User {
private String username;
private String password;
private Integer age;
/**
* 构造方法
* @param username
* @param password
*/
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User(String username, String password, Integer age) {
// 调用其它的构造方法
this(username, password);
// 这样总不行的吧
// new User(username, password);
this.age = age;
}
/**
* 成员方法
* @author yangwei
* @date 2022年2月9日
*
*/
public void User(String username, String password) {
System.out.println("我啥也不是");
}
public void introduce() {
// 构造函数
new User("yw", "password");
// 不声明返回值的方法调用
User("yw", "password");
System.out.println("my name is " + username + " age is " + age);
}
public static void main(String[] args) {
User user = new User("yw", "password", 21);
user.introduce();
}
}
注意:
this()不能出现在普通方法中;
this()必须出现在方法第一行;
不能在构造方法之间循环调用。