父类方法中的this
一直在用一些东西,却总是感觉有一些疑惑,今天发现了自己一个及其致命的意识错误。关于父类中this关键字到底是谁的问题。请看代码
父类Parent
- public class Parent {
- public Parent(){
- System.out.println("父类自己---->"+this);
- }
- public void onCreate(){
- System.out.println("父类中的---->"+this);
- ObjectCollectionUtils.addObject(this);
- }
- }
子类Son
- public class Son extends Parent{
- public Son() {
- onCreate();
- }
- @Override
- public void onCreate() {
- super.onCreate();
- }
- }
工具类ObjectCollectionUtils
- public class ObjectCollectionUtils {
- private static List<Object> list = new ArrayList<>();
- public static void addObject(Object object){
- System.out.println("工具类add--->"+object);
- list.add(object);
- }
- }
测试类test
- public class test {
- public static void main(String[] args) {
- Son son1 = new Son();
- System.out.println("子类---->"+son1);
- Son son2 = new Son();
- System.out.println("子类---->"+son2);
- Son son3 = new Son();
- System.out.println("子类---->"+son3);
- }
- }
因为我是搞android的,所以这几个类其实就是简单的模仿android中常用功能技巧BaseActivity和ActivityCollection的类的使用。不说这几个类为什么要这样写了,我们就来看看父类中this这个关键字打印出的东西到底是什么?如果不明白onCreate方法是干什么的,那就忽略就行,咱们看构造函数中输出的this是什么吧。
我们最常听到的一句话就是不管在哪,this关键字指的都是当前对象,那么在父类Parent构造函数中输出的this一个喝子类Son构造函数中输出的this分别是父类当前引用和子类的当前引用。那么我们来看一下输出结果:
- 父类自己---->Son@670b5064
- 父类中的---->Son@670b5064
- 工具类add--->Son@670b5064
- 子类---->Son@670b5064
- 父类自己---->Son@c33f45e
- 父类中的---->Son@c33f45e
- 工具类add--->Son@c33f45e
- 子类---->Son@c33f45e
- 父类自己---->Son@26f04d94
- 父类中的---->Son@26f04d94
- 工具类add--->Son@26f04d94
- 子类---->Son@26f04d94
不知道大家有没有猜对这个结果呢?不管是父类中调用工具类的时候传入的this,还是父类中构造方法的this,亦或者是父类中普通方法onCreate中的this,都是指子类对象的this。因为我个人在平时的使用过程中,对this和super的使用也不会出现错误,都能正确使用,但是最近这个疑惑一直让我觉得很可疑,所以今天写几个类测试一下。我说一下我为什么会觉得父类中的this应该是父类本身对象的this(这是错误的想法),子类实例化的过程会先去执行父类的构造函数,这个大家肯定都是知道,但我过去错误的以为,执行了父类的构造函数意味着新建了父类的对象.......,所以我才会觉得父类中的this指的应该是父类的对象引用。但是,其实我上面写的这些类的过程中,仅仅的是创建了son1,son2,son3这个子类对象,虽然都走了父类的构造函数,但是并不创建父类对象,所以父类中的this便指的是他子类的具体this。over!!!
注意:我做的测试是,实例化子类,看父类中this关键字是谁。若你们正常去是实例化父类,那么你执行父类中相应的方法,那么方法中的this值得就是父类对象本身的引用,希望有些人看了以后不要被误导,所以强调一下。
父类方法中的this的更多相关文章
- python 父类方法中使用不同的子类中的不同类对象
# coding:utf-8 class Animal(object): def __init__(self): self._name = None self._f = None def eat(se ...
- struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法
struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- 关于Java中子类调用父类方法
当一个类继承于另一个类,子类中没有父类的方法时.用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,在pyth ...
- Java中子类覆盖父类方法所必须满足的条件
因为太喜欢,所以转来,侵删! 参考自:http://www.it165.net/pro/html/201504/39284.html 一.描述 子类重写(覆盖)父类的方法必须满足的条件:1.父类中的方 ...
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...
- 【Python】Python中子类怎样调用父类方法
python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...
- java继承-子类调用父类的方法中包含子类重写的方法
# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args ...
随机推荐
- [BS-31]导航控制器的interactivePopGestureRecognizer属性
导航控制器的interactivePopGestureRecognizer属性 如何自定义导航控制器push出来的视图控制器的左侧返回按钮? 首先需要知道的是:如果要自定义push出来的VC的左侧返回 ...
- 前向后瞻正则表达式及其JS例子
定义 x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找. 比如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'./Jack(?=Sprat|F ...
- [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 " ...
- Linux Server 14.04输入数字变为了*
虚拟机装好了Ubuntu14.04后,大键盘上边的数字输入时变为了*(奇葩的加密吗?!!) 从网上看到别人都遇到的是小键盘输入数字时,会变为字符,我这小键盘却是没问题,大键盘有问题奇葩. 如果小键盘输 ...
- node与Elment以及子节点childrenNode与children的区别(2)
测试代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- C++之路进阶——codevs1362(网络扩容)
1362 网络扩容 省队选拔赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给定一张有向图,每条边都有一个容量 ...
- JSR 303标准
JSR 303是Java为bean数据合法性校验提供的标准框架,JSR 303通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则,并通过标准的校验接口对bean进行验证. ...
- 从表中删除重复记录的sql
--有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...
- UBIFS 文件系统分析1 - 磁盘结构【转】
转自:http://blog.csdn.net/kickxxx/article/details/7109662 版权声明:本文为博主原创文章,未经博主允许不得转载. ubifs磁盘结构 UBIFS文件 ...