父类方法中的this

Posted 李慕白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了父类方法中的this相关的知识,希望对你有一定的参考价值。

一直在用一些东西,却总是感觉有一些疑惑,今天发现了自己一个及其致命的意识错误。关于父类中this关键字到底是谁的问题。请看代码

父类Parent

 

[java] view plain copy
 
  1. public class Parent {  
  2.     public Parent(){  
  3.         System.out.println("父类自己---->"+this);  
  4.     }  
  5.     public void onCreate(){  
  6.         System.out.println("父类中的---->"+this);  
  7.         ObjectCollectionUtils.addObject(this);  
  8.     }  
  9. }  

 

子类Son

 

[java] view plain copy
 
  1. public class Son extends Parent{  
  2.     public Son() {  
  3.         onCreate();  
  4.     }  
  5.     @Override  
  6.     public void onCreate() {  
  7.         super.onCreate();  
  8.     }  
  9. }  


工具类ObjectCollectionUtils

 

 

[java] view plain copy
 
  1. public class ObjectCollectionUtils {  
  2.     private static List<Object> list = new ArrayList<>();  
  3.     public static void addObject(Object object){  
  4.         System.out.println("工具类add--->"+object);  
  5.         list.add(object);  
  6.     }  
  7. }  


测试类test

 

 

[java] view plain copy
 
  1. public class test {  
  2.     public static void main(String[] args) {  
  3.         Son son1 = new Son();  
  4.         System.out.println("子类---->"+son1);  
  5.         Son son2 = new Son();  
  6.         System.out.println("子类---->"+son2);  
  7.         Son son3 = new Son();  
  8.         System.out.println("子类---->"+son3);  
  9.     }  
  10. }  


因为我是搞android的,所以这几个类其实就是简单的模仿android中常用功能技巧BaseActivity和ActivityCollection的类的使用。不说这几个类为什么要这样写了,我们就来看看父类中this这个关键字打印出的东西到底是什么?如果不明白onCreate方法是干什么的,那就忽略就行,咱们看构造函数中输出的this是什么吧。

 

我们最常听到的一句话就是不管在哪,this关键字指的都是当前对象,那么在父类Parent构造函数中输出的this一个喝子类Son构造函数中输出的this分别是父类当前引用和子类的当前引用。那么我们来看一下输出结果:

 

[html] view plain copy
 
  1. 父类自己---->[email protected]  
  2. 父类中的---->[email protected]  
  3. 工具类add--->[email protected]  
  4. 子类---->[email protected]  
  5. 父类自己---->[email protected]  
  6. 父类中的---->[email protected]  
  7. 工具类add--->[email protected]  
  8. 子类---->[email protected]  
  9. 父类自己---->[email protected]  
  10. 父类中的---->[email protected]  
  11. 工具类add--->[email protected]  
  12. 子类---->[email protected]  


不知道大家有没有猜对这个结果呢?不管是父类中调用工具类的时候传入的this,还是父类中构造方法的this,亦或者是父类中普通方法onCreate中的this,都是指子类对象的this。因为我个人在平时的使用过程中,对this和super的使用也不会出现错误,都能正确使用,但是最近这个疑惑一直让我觉得很可疑,所以今天写几个类测试一下。我说一下我为什么会觉得父类中的this应该是父类本身对象的this(这是错误的想法),子类实例化的过程会先去执行父类的构造函数,这个大家肯定都是知道,但我过去错误的以为,执行了父类的构造函数意味着新建了父类的对象.......,所以我才会觉得父类中的this指的应该是父类的对象引用。但是,其实我上面写的这些类的过程中,仅仅的是创建了son1,son2,son3这个子类对象,虽然都走了父类的构造函数,但是并不创建父类对象,所以父类中的this便指的是他子类的具体this。over!!!

 

 

注意:我做的测试是,实例化子类,看父类中this关键字是谁。若你们正常去是实例化父类,那么你执行父类中相应的方法,那么方法中的this值得就是父类对象本身的引用,希望有些人看了以后不要被误导,所以强调一下。

以上是关于父类方法中的this的主要内容,如果未能解决你的问题,请参考以下文章

java 子类继承父类属性 this打点调用初始化父类属性 父类中无有参构造方法

Typescript中的类

随笔14 java中的关键字

两段关于this的代码

java 中 super和this的异同

java中this和super关键字