第十一讲 this关键字
1 什么是this?
this 指的是这个,从字面上理解我们就能知道,它与对象有关。
一个类可以产生多个对象。this就是指当前的这个对象的代名词。
我们说:这个人很帅,你是不是指了具体的某一个人!
public class This01
{
private int id;
private String name;
public This01(int id, String name) {
this.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");
This01 t2 = new This01(2, "b");
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) {
this.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");
t1 = null;
This01 t2 = new This01(2, "b");
t1.test();
}
}