第十一讲 this关键字

本文介绍了Java中的this关键字,它用于引用当前对象。在构造方法中,this用于区分成员变量和局部变量,确保正确赋值。成员方法中,this作为隐含参数,标识调用该方法的对象。当对象引用为null时,调用成员方法会抛出空指针异常,因为对象不存在。此外,文章还讨论了静态方法与成员方法的区别,强调了this在成员方法中的重要性。
摘要由CSDN通过智能技术生成

第十一讲 this关键字

1 什么是this?

this 指的是这个,从字面上理解我们就能知道,它与对象有关。
一个类可以产生多个对象。this就是指当前的这个对象的代名词。
我们说:这个人很帅,你是不是指了具体的某一个人!
public class This01 
{
	private int id;
	private String name;
/*	
	public This01(int id, String name) {
		id = id;
		name = name;
		// 这样赋值有什么问题?就近原则,不会给成员变量赋值。
	}
*/
	public This01(int id, String name) {
		this.id = id;
		// 等号右边的id指的是构造方法中传入的id
		// 等号左边的id指的是成员属性中的id
		this.name = name;
	}

	public String toString() {
		return "id = " + id + " name = " + name; 
	}
	
	public static void main(String[] args) {
		This01 t1 = new This01(1, "a");
		//我们给构造方法传入id的值为1,t1这个对象的成员属性中的id值被赋为1。
		// this在这里指代的是谁?是不是就是t1
		This01 t2 = new This01(2, "b");
		//我们给构造方法传入id的值为2,t2这个对象的成员属性中的id值被赋为2。
		// this在这里指代的是谁?是不是就是t2
		System.out.println(t1);
		System.out.println(t2);
	}
}
不管是成员方法也好,还是成员属性也好,他们都是成员的
t1.print();是"引用.",引用t1他不是对象,它没有成员方法和成员属性的。它只是对象的别名而已。所以叫引用。
t1调用一个成员方法的时候,实际上是t1所指向的这个对象在调用print()。
因为每个成员方法中都有一个隐含的this参数,这个参数用来接收调用它的对象的this引用的值。

this.print();
print(This01 t);
print(t1);
. 叫做的
t1的,t1是对象的引用,我们说成员方法是谁的?对象的
对象去调,对象在堆内存中,不在栈中。
所以调用方法的时候,真正的出发点肯定不是从栈里面出发的,而是从堆里面出发的。
堆里面唯一可能的出发点就是this。this就是这个对象本身。

this.print();----> print(this)
t1.print() ---> print(This01 t)---> print(t1)
this = t1;
从此以后,jvm知道了是t1调用了print()方法

结论:静态方法和成员方法最大的区别在于,静态方法中没有隐含的this参数。
成员方法中有隐含的this参数。
这样也就解释了,为什么空指针异常发生在调用成员方法时,不会再静态方法被调用的时候发生。

回头看空指针异常
t1 = null;
请问t1的类型是什么?t1的类型变了么?不可能变,还是This01类型
为什么t1.print()就会报空指针呢?
我们一直以为是"引用."
我们一直以为是引用调的成员方法,事实是这样吗?如果是,怎么可能空指针异常呢?

t1内容为null以后,对象就找不到了。对象就被回收了。所以,不会再去调用成员方法。就会报空指针异常。


记住这个结论就好了:每个成员方法和成员变量都带有一个this,这个this绝大部分情况下可以被省略,做区分的时候可以写出来。
public class This01 
{
	private int id;
	private String name;
/*	
	public This01(int id, String name) {
		id = id;
		name = name;
		// 这样赋值有什么问题?就近原则,不会给成员变量赋值。
	}
*/
	public This01(int id, String name) {
		this.id = id;
		// 等号右边的id指的是构造方法中传入的id
		// 等号左边的id指的是成员属性中的id
		this.name = name;
	}
	
	public void print() {
		System.out.println("hello!!!!!!!!");
	}
	
	public void test() {
		this.print();
	}

	public String toString() {
		return "id = " + id + " name = " + name; 
	}
	
	public static void main(String[] args) {
		This01 t1 = new This01(1, "a");
		//我们给构造方法传入id的值为1,t1这个对象的成员属性中的id值被赋为1。
		// this在这里指代的是谁?是不是就是t1
		t1 = null;
		This01 t2 = new This01(2, "b");
		//我们给构造方法传入id的值为2,t2这个对象的成员属性中的id值被赋为2。
		// this在这里指代的是谁?是不是就是t2
		t1.test();
		// 这个代码有什么疑问吗?
		// 凭什么JVM知道是谁调用的print()方法呢?
		// 因为print()方法中有一个隐含的参数,叫做this,谁调用,谁就是这个this
		// t1调用test(),t1就是这个this
		// 成员方法中,都有一个隐含的this参数,位置不详,我们无需知道它在哪里。
		// 但一定要知道他有一个隐含的this指针。
		// 谁调用这个成员方法,this就是谁。
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值