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

父类Parent

  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

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

工具类ObjectCollectionUtils

  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

  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分别是父类当前引用和子类的当前引用。那么我们来看一下输出结果:

  1. 父类自己---->Son@670b5064
  2. 父类中的---->Son@670b5064
  3. 工具类add--->Son@670b5064
  4. 子类---->Son@670b5064
  5. 父类自己---->Son@c33f45e
  6. 父类中的---->Son@c33f45e
  7. 工具类add--->Son@c33f45e
  8. 子类---->Son@c33f45e
  9. 父类自己---->Son@26f04d94
  10. 父类中的---->Son@26f04d94
  11. 工具类add--->Son@26f04d94
  12. 子类---->Son@26f04d94

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

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

父类方法中的this的更多相关文章

  1. python 父类方法中使用不同的子类中的不同类对象

    # coding:utf-8 class Animal(object): def __init__(self): self._name = None self._f = None def eat(se ...

  2. struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

    struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

  3. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  4. 关于Java中子类调用父类方法

    当一个类继承于另一个类,子类中没有父类的方法时.用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...

  5. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承                                                                          继承是一种创建新的类的方式,在pyth ...

  6. Java中子类覆盖父类方法所必须满足的条件

    因为太喜欢,所以转来,侵删! 参考自:http://www.it165.net/pro/html/201504/39284.html 一.描述 子类重写(覆盖)父类的方法必须满足的条件:1.父类中的方 ...

  7. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  8. 【Python】Python中子类怎样调用父类方法

    python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...

  9. java继承-子类调用父类的方法中包含子类重写的方法

    # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args ...

随机推荐

  1. [BS-31]导航控制器的interactivePopGestureRecognizer属性

    导航控制器的interactivePopGestureRecognizer属性 如何自定义导航控制器push出来的视图控制器的左侧返回按钮? 首先需要知道的是:如果要自定义push出来的VC的左侧返回 ...

  2. 前向后瞻正则表达式及其JS例子

    定义 x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找. 比如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'./Jack(?=Sprat|F ...

  3. [Android Tips] 10. Pull out /data/data/${package_name} files without root access

    #!/usr/bin/env bash PACKAGE_NAME=com.your.package DB_NAME=data.db rm -rf ${DB_NAME} adb shell " ...

  4. Linux Server 14.04输入数字变为了*

    虚拟机装好了Ubuntu14.04后,大键盘上边的数字输入时变为了*(奇葩的加密吗?!!) 从网上看到别人都遇到的是小键盘输入数字时,会变为字符,我这小键盘却是没问题,大键盘有问题奇葩. 如果小键盘输 ...

  5. node与Elment以及子节点childrenNode与children的区别(2)

    测试代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  7. C++之路进阶——codevs1362(网络扩容)

    1362 网络扩容 省队选拔赛  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 给定一张有向图,每条边都有一个容量 ...

  8. JSR 303标准

    JSR 303是Java为bean数据合法性校验提供的标准框架,JSR 303通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则,并通过标准的校验接口对bean进行验证. ...

  9. 从表中删除重复记录的sql

    --有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...

  10. UBIFS 文件系统分析1 - 磁盘结构【转】

    转自:http://blog.csdn.net/kickxxx/article/details/7109662 版权声明:本文为博主原创文章,未经博主允许不得转载. ubifs磁盘结构 UBIFS文件 ...