public class FirstClass {
public String getClassName(){
return "First+" + this.getClass().getName();
}
}public class SecondClass extends FirstClass {
public String getClassName() {
return super.getClass().getName();
}
}public class Test {
    public static void main(String[] args){
     FirstClass s = new SecondClass();   
     System.out.println(s.getClassName());
    }
}
如代码所示,main函数中调用的应该是SecondClass中的getClassName方法,其返回super.getClass().getName(),那么其super应该是FirstClass,应该打印出的是FirstClass的类名才对,但是打印出的却是SecondClass类名.把FirstClass s = new SecondClass();  这句改成SecondClass = new SecondClass(); 后也是一样,谁能解释一下这个问题?谢谢.  

解决方案 »

  1.   

    仔细看getClass的说明
    不过是那个基类调用,返回的都是这个对象的class的名字,而不是基类的名字
    返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
      

  2.   

    sorry刚才大错字了仔细看getClass的说明
    返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。不管是那个基类调用,返回的都是这个对象的class的名字,而不是基类的名字
      

  3.   

    getClass() 
              返回此 Object 的运行时类!所以s指向SecondClass类.是多态的机制使s指向SecondClass!这样理解不知道对不对?
      

  4.   

    不好意思,可能我搞错了。我是这样猜测的,类创建的时候都会将自己的类名保存下来,然后getClass()通过多态拿到这个class name。
    不过刚才查了一下object.java 没有这个方法的实现。
    所以仅仅是猜测,知道结果就可以了
      

  5.   

    另外,不管是
    FirstClass s = new SecondClass();
    还是
    SecondClass s = new SecondClass(); 
    s在运行时都是SecondClass的实例.