一道关于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


大家来讨论下,这是什么原因?
...全文
71 点赞 收藏 6
写回复
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()输出)
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告