Java中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()必须出现在方法第一行;
不能在构造方法之间循环调用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值