父类方法中使用this,那么这个this指的是谁?
2016-02-01 17:03
120 查看
一直在用一些东西,却总是感觉有一些疑惑,今天发现了自己一个及其致命的意识错误。关于父类中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值得就是父类对象本身的引用,希望有些人看了以后不要被误导,所以强调一下。
----------------------------
本人原创,请勿转载、复制、黏贴。-----Ade
父类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值得就是父类对象本身的引用,希望有些人看了以后不要被误导,所以强调一下。
----------------------------
本人原创,请勿转载、复制、黏贴。-----Ade
相关文章推荐
- 树莓派无显示器上手步骤
- strindex实现
- fir.im Weekly - 技术人也要苦练“七十二变”
- Android Fragment是什么
- 游戏中接入第三方渠道时 关于meta-data的一些小问题
- 网狐 自绘 倒计时和准备按钮
- Java实现排队论的原理
- VNC Server Configuration
- POJ3461 字符串hash
- python 几种常见的测试框架
- iOS开发-NSInteger 和 int 的区别
- 加载动作
- MongoDB的安装以及自启动问题
- OI知识体系
- 多线程之NSThread
- 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论
- 如果数据文件顺序被打乱,你有办法找回正确的文件把数据库打开吗?
- Bool
- AS不能发布release版本的解决方案
- mongodb---第一天