一道关于this和super的面试题

lynn_chen 2011-06-14 01:40:43
昨天下午去面试的时候遇到一道题,大家看看。
class SuperClass {
SuperClass() throws Exception {
System.out.println(this.getClass().getName());
}
void show() {
System.out.println(super.getClass().getName());
show2();
}
void show2() {}
}




public class SubClass extends SuperClass {
SubClass() throws Exception {}
void show() {
super.show();
System.out.println(super.getClass().getName());
}

void show2() {
System.out.println(super.getClass().getSuperclass().getName());
}

public static void main(String args[]) throws Exception {
SuperClass s = new SubClass();
s.show();
}
}



先自己做一下,然后再debug看看。

我写的答案是:
SuperClass
Object
SuperClass

我理解的运行流程是:

1. SuperClass s = new SubClass();
首先主线程进入main,此时加载两个.class文件进方法区,当new SubClass()时,在堆区实例化这两个类,依次调用SuperClass()和SubClass()(还有Object)。

(SuperClass)
SuperClass() throws Exception {
System.out.println(this.getClass().getName());
}

这个this应该是父类的实例啊?(没搞懂!)
打印结果是:SuperClass

2. s.show();

应用变量s引用的是SubClass的实例,s.show调用的是子类的覆盖方法show(),

(SubClass)
void show() {
super.show();
System.out.println(super.getClass().getName());
}

进入方法后,压入方法栈,运行super.show()父类实例的show()方法:

(SuperClass)
void show() {
System.out.println(super.getClass().getName());
show2();
}

这个super又应该是SuperClass的父类实例(Object的实例)。
打印结果是:Object

然后show2(),这个应该是父类的实例的方法,是个空方法,所以什么都不打印。

最后出栈,运行(SubClass.show()的第2个语句)
System.out.println(super.getClass().getName());
打印结果是:SuperClass

实际的运行结果是:

SubClass
SubClass
SuperClass
SubClass


大家来讨论下,这是什么原因?
...全文
250 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
如梦如醉 2011-06-15
  • 打赏
  • 举报
回复
分析下代码代码就行了
qybao 2011-06-14
  • 打赏
  • 举报
回复
其实很简单
LZ只要能理解以下的代码,就能理解问题的结果了

SuperClass sc = new SubClass();
System.out.println(sc.getClass());
SuperClass sc2 = (SupperClass)sc; //强行转换为父类,看看有没有效果?
System.out.println(sc2.getClass());

回眸婉约 2011-06-14
  • 打赏
  • 举报
回复
这些面试题可真······不解释啊···都是常用到的···
凯瑞甘 2011-06-14
  • 打赏
  • 举报
回复
楼主只要知道this表示当前类对象,super表示父类对象就很容易了
飞跃颠峰 2011-06-14
  • 打赏
  • 举报
回复
对象s是一个SubClass的实例,
getClass()永远是返回实例的实际Class,所以s.super.getClass仍然返回SubClass

运行过程应该是这样的 :
1) SubClass (由SuperClass()方法输出)
2) SubClass (SubClass.show() --> SuperClass.show()输出)
3) SuperClass (SubClass.show() --> SuperClass.show() --> SubClass.show2()输出)
这里super.getClass()是SubClass,super.getClass().getSuperClass()是SuperClass
4) SubClass (SubClass.show()输出)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧