隐藏在暗中的this指针
来源:互联网 发布:淘宝访问受限怎么回事 编辑:程序博客网 时间:2024/04/26 05:28
同事阅读代码的时候遇到了个颇具迷惑性的问题,拿来问我,我提炼简化了一下,大概是这样:
//Ext.java
public class Ext {
public static void main(String[] args) {
Son s = new Son();
s.method1();
}
}
//Father.java
public class Father {
public void method1(){
System.out.println("father's method1");
method2();
}
public void method2(){
System.out.println("father's method2");
}
}
//son.java
public class Son extends Father {
public void method1() {
System.out.println("son's method1");
super.method1();
}
public void method2() {
System.out.println("son's method2");
}
}
输出结果是:
son's method1
father's method1
son's method2
还是
son's method1
father's method1
father's method2
答案是前者。
如果把main()中的
Son s = new Son();
s.method1();
改成
Father f = new Son();
f.method1();
结果有如何呢?
答案还是前者。
首先来说
Son s = new Son();
s.method1();与
Father f = new Son();
f.method1();
效果是一样的,多态使然。不多说了。
那么输出的最后一行为什么是son's method2而不是father's method2?表面来看Son类的method1调用了其父类Father类的method1,Father类的method1调用了一个method2,而这个method2到底是父类的,还是子类的呢?
其实这行代码里省略了一个this,即this.method2();,那么this指向的是谁,调用的自然就是谁的method2了。很明显this指向的是一个Son的实例,即s,结果也是理所当然的了。
如果还想看看this指向的到底是什么,可以在Father类和Son类的method1、method2方法的原有的System.out.println()语句下增加一行System.out.println(this.toString());。此时输出结果类似于:
son's method1
Son@765291
father's method1
Son@765291
son's method2
Son@765291
- 隐藏在暗中的this指针
- 堆上的函数析构,隐藏的this指针
- 什么是this指针?this指针在背后默默的付出了什么?
- this指针在类的成员函数中的传递
- 奇怪的 this 指针
- this指针的用法
- this指针的总结
- this指针的用处
- this指针的用法
- 类的this指针
- this指针的使用
- js的this指针
- this指针的使用
- c++的this指针
- c++的this指针
- this 指针的使用
- 隐含的 this 指针
- 隐含的this指针
- set constraints all deferred|immediate的作用
- 初试XSL
- 一年前的帖子,一年前的回忆(渐行渐远 2004)
- 可完全定制的Javascript日历 (Callback 实现)
- Eclipse基础--安装eclipse及语言包
- 隐藏在暗中的this指针
- 个人所得税计算器 源代码 及 程序
- C++事件的实现
- 使用XMLBeans处理XML数据和文档入门
- 时刻准备着:被抢劫(附安全守则)
- Linux/Debian 基本配置日记
- 今天开始成为QT的新人
- 自己写了个javascript中不采用正则表达式的replace函数的
- 如何使用Visual C++调试程序?【转贴】