This 关键字
1、作用:
是一个关键字(指代词),代替一个对象(当前调用属性或方法时的那个对象),不一定是当前类。代替的是调用方法的那个类。
2、this可以调用属性、方法;this可以在一个构造方法内调用另一个构造方法,通过this()的方式,省略了调用的构造函数的函数名,但必须在构造函数第一行;
3、this调用的过程可以放置在类中的任何一个成员位置
类(对象)加载机制
创建对象
Person p = new Person();
当我们在创建对象时,首先会在存储区加载一个该对象所属类的模板,如果该类继承了一个父类,则同时也会加载这个父类的模板。
在new Person()时,会在堆内存中开辟一个Person空间,在其中加载Person类所含有的成员,如果Person类有父类的话,还会在这个Person空间中再分出一块地方开辟父类空间,在其中加载父类的成员。
当所有的成员都加载完成后,会将new Person()所开辟出空间的地址引用赋给 栈内存中的Person 类型变量 p。
调用方法:
p.eat();
当我们调用这个对象中的方法时,会先在栈内存中开辟一个临时的执行空间,用来加载这个对象。然后该对象会去堆内存的对象空间中寻找所调用的这个方法。
1、eat()方法为父类方法,且在子类Person类中未重写
p拿着地址引用去堆内存中寻找eat()方法,发现Person类中没有这个方法,则会继续前往Person类的父类中寻找这个方法
2、eat()方法为Person特有或eat()方法是Person类重写的父类方法
p拿着地址,在堆内存中找到Person类,在Person类中找到了eat()方法,就将该方法带回,不再继续寻找。
This关键字调用方法时的影响
假设当前的父子类中都有eat()方法,输出一句“我是父/子类中的eat方法”,之后在各自的构造函数中通过this.eat()方式,调用这个方法。
最后的输出结果如图所示:
因为this关键字所代表的的是当前调用对象而不是当前类,所以在程序执行时,实际上父类Animal中的this代表的是Person对象,自然调用的也是Person类中的eat方法。用类的加载来说的话就是,当父类中得到this到堆内存中寻找eat()方法时,首先在Person 类中发现了这个方法,就直接取走这个方法执行,不再找下去。
所以,在使用this关键字时需要多加注意