一直在用一些东西,却总是感觉有一些疑惑,今天发现了自己一个及其致命的意识错误。关于父类中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. Python之路-python(面向对象进阶(模块的动态导入、断言、Socket Server))

    模块的动态导入 断言 Socket Server 一.模块的动态导入 class C(object): def __init__(self): self.name = "zhangsan&q ...

  2. php +html5 websocket 聊天室

    针对内容比较长出错,修改后的解码函数 和 加码函数 原文请看上一篇 http://yixun.yxsss.com/yw3104.html function uncode($str,$key){ $ma ...

  3. MySQL基础CRUD编程练习题的自我提升(1)

    基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2:库级知识 2.1 显示数据库: show databases; 2.2 选择数据库: us ...

  4. cocos2dx 3.x(在Mac平台下利用Eclipse打包安卓apk安装包详细教程)

    最近在学习cocos2dx在MAC上如何打包apk,今天先把安装JDK和ANT的过程记来. 首先,打开终端,输入"java -version" 点击回车后,出现如下提示: 我们的M ...

  5. [Android Tips] 13. How to Detect Tablet

    /** * 判断是否是平板 * @param context * @return */ public static boolean isTablet(Context context) { return ...

  6. 1.2 如何在visual studio 中建立C#程序

    这一节简单介绍一下怎么在visual studio 2015中建立第一个C#程序,我使用的是2015版的visual studio,不同版本可能有一些差异,不过大体上是相同的,这些信息仅供新手参考,大 ...

  7. 理解NDCG

    关于NDCG,wiki给点解释很详细,这里我谈谈我的理解. NDCG(Normalized discounted cumulative gain):是用来衡量排序质量的指标. 其中一种计算公式如下: ...

  8. window.event对象详尽解析

    event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromEleme ...

  9. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数005·graphics-obj,基本绘图单元,包括线段、矩形、椭圆、圆形

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数005·graphics-obj,基本绘图单元,包括线段.矩形.椭圆.圆形 graphics-obj,基本绘图单元, ...

  10. Java在Web开发语言上败给了PHP

    PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...