昨天下午去面试的时候遇到一道题,大家看看。
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
大家来讨论下,这是什么原因?

解决方案 »

  1.   

    对象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()输出) 
      

  2.   

    楼主只要知道this表示当前类对象,super表示父类对象就很容易了
      

  3.   

    其实很简单
    LZ只要能理解以下的代码,就能理解问题的结果了SuperClass sc = new SubClass();
    System.out.println(sc.getClass());
    SuperClass sc2 = (SupperClass)sc; //强行转换为父类,看看有没有效果?
    System.out.println(sc2.getClass());