public class PrintClass {
    int x = 0;
    int y = 1;    void printMe() {
        System.out.println("x is " + x + ", y is " + y);
        System.out.println("I am an instance of the class " +
        super.getClass().getName());
    }
}class PrintSubClass extends PrintClass {
    int z = 3;    public static void main(String[] arguments) {
        PrintSubClass obj = new PrintSubClass();
        obj.printMe();
    }
}
****************************************************************
javac PrintClass.java后
执行: java PrintSubClass
为什么输出结果是 I am an instance of the class PrintSubClass
而不是           I am an instance of the class PrintClass      ?

解决方案 »

  1.   

    你引用的是 PrintSubClass 当然是subclass了,
      

  2.   

    因为PrintSubClass 继承 PrintClass 运行super会指向父类的getClass().getName()
      

  3.   

    可以看看Think in Java。
      

  4.   

    关键在这一句:
        PrintSubClass obj = new PrintSubClass();说明你是用PrintSubClass的构造方法来创建的一个PrintSubClass类的对象...
    get的当然是这个名字啊..
      

  5.   

    super.getClass().getName()相当于是((PrintClass)obj).getClass().getName()
    所以输出的当然是I am an instance of the class PrintSubClass
      

  6.   

    我这么理解:
    每个类在运行时,多有一个class类。
    而你实例的是PrintSubClass类,父类PrintClass并没有被实例。
    看来问题是由“getClass()”产生的,getClass只针对我们new 的那个类。
      

  7.   

    这个getClass()方法是Object类定义的,它返回运行时所引用对象的Class类,你在那两个类中并没有重写它。虽然PrintSubClass继承了PrintClass,你在printMe()方法中使用super关键字好像是想让它调用PrintClass类的getClass()版本,可PrintClass类中没有重写此方法,所以将调用从Object类继承下来的getClass()方法.
    (实际上由于printMe()方法是在PrintClass中的,在其中使用super关键字将会直接调用Object类的原版本方法,假如你要测试PrintClass类定义的方法,那么应该在其子类PrintSubClass中使用super关键字。)