请问各位,结果是怎么的出来的?
谢谢了class A{
   public A(){}
   public void getClassName(){
       System.out.println(super.getClass());
       System.out.println(this.getClass());
   }
}
class B extends A{
    public void getClassName(){
         super.getClassName();
          System.out.println(super.getClass());
          System.out.println(this.getClass());
     }
}
public class TestSuper{
     public static void main(String[] args){
          A a= new B();
          a.getClassName();
      }
}

解决方案 »

  1.   

    会输出4条记录很好理解,因为B中调用了super.getClassName();而第一和第三条为什么输出Class B呢,是因为getClass()来自于Object类,所有类的父类,它的作用就是获得当前对象的类类型。而在初始化的时候,A a = new B()显示了a是B的对象。super是对父类的引用,但不是对父对象的引用(没有父对象这个说法),它不是一个对象,所以不能像this一样作为一个对象去使用。 
    通过super可以调用(该对象的)在父类中申明的变量和方法。(有访问控制) 
      

  2.   

    声明的a是new一个B类型的一个对象,所以a.getClass()就是B,不会自动向上转型
      

  3.   

    有点怪 ,不明白 为什么都是class B
      

  4.   

    class com.dongyang.face.B
    class com.dongyang.face.B
    class com.dongyang.face.B
    class com.dongyang.face.B答案,不知道为什么
      

  5.   

    public final Class<? extends Object> getClass()返回一个对象的运行时类。该 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
      

  6.   

    不管是this.getClass()还是super.getClass().jvm都要检查this,super的真正类型是什么,就像a是A的引用,但a的真正类型是B,所以要调用B类的getClassName().
    同理,this,和super的真正的类型都 是B类,所以getClass()返回的都是Class B
      

  7.   

    getClass是Object类的方法,目的是得到运行时的类的类型,注意并不是Object本身的类型(如果得到Object类型,这个方法还有屁用?)。而我们写的所有的类,都没有重写这个方法,所以要调用Object的getClass方法,如果这个方法不能返回实际的类,这个方法有什么用?
      

  8.   

    虽然我也不太懂,但我猜结果也应该是全部都是 class B.
    先自我解释一下,可能不太准确:
    getClass是Object的一个方法,它返回的是一个运行时系统中这个类所代表的类名,在这里面就是 a ,不管是它的 super 的这个方法,还是 this 的这个方法,最终都是 对象 a实际代表的类型。那就是b,虽然它声明的时候是A类。
    查API文档:
    Returns the runtime class of this Object. The returned Class object is the object that is locked by static synchronized methods of the represented class. 
      

  9.   

    准确的说a.getClass 返回的是Java虚拟机中为a的实际类型维护的唯一的一个Class对象,a.getClass.getSimpleName()才是该类简单的类名
      

  10.   

    getClass()返回一个对象的运行时类, A a= new B();
    在编译期间的类型为A,但真正运行起来后是B,
    B中的getClassName方法虽然调用了父类的方法
    super.getClass()
    但是它返回的是表示该对象的运行时类的 java.lang.Class 对象
    而不是返回一个类的名字
      

  11.   

    java中没有虚方法这个概念,那是C++的
      

  12.   

    java中的方法都是虚方法
    这句话解答了我很多困惑