This关键字+类加载机制

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关键字时需要多加注意

发布了47 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/monologuezjp/article/details/98846720