黑马程序员技术交流社区

标题: 对getClass()的疑惑 [打印本页]

作者: 张豪杰    时间: 2013-2-26 23:05
标题: 对getClass()的疑惑
mport java.util.Date;

public  class Test extends Date{

public static void main(String[] args) {

new Test().test();

}



public void test(){

System.out.println(super.getClass().getName());

}

}

为什么输出的是子类不是父类?
作者: 彭颖    时间: 2013-2-27 00:37
getClass返回的是此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

主函数里运行的是Test,所以是返回此对象运行时类的Class对象就是Test
作者: 付玉光    时间: 2013-2-27 01:41

import java.util.Date;
class Test1 extends Date{
        public static void main(String[] args) {
                new Test1().test();
        }
        public void test(){
                System.out.println(super.getClass().getName());
        }
}
//为什么输出的是子类不是父类????
//①
//getClass()方法位于Object类当中,是一个不可被子类覆写的方法,

//是一个非静态方法,可由对象来调用,该方法的返回值是由所表示类的

//static synchronized 方法锁定的Class对象,也就是说,当我们在程序中

//用到某个类时,类加载器把它对应的字节码文件加载进内存并对其进行静态

//代码块初始化时,就确定了,当调用该方法后的返回值为本类的字节码文件对象。
//②
//super调用父类的方法,主要作用在子类中定义了和父类中同名的属性或方法,

//但想访问父类中的属性或方法时而用这种形式。

//希望对你有帮助{:soso_e100:}
作者: 王钊    时间: 2013-2-27 11:28
本帖最后由 王钊 于 2013-2-27 11:30 编辑

要看看javaAPI文档怎么说的:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
什么是运行时类?!运行时类是Object的一个实例,注意,他返回的不是Object.class,他返回的是运行时类,就是虚拟机中是谁在运行就是谁,如果你new Date(),Date当然是运行时类,而不是Test。
Test继承Date,即使有一个属于Date的getClass()返回的也不可能是Date.class,因为当new Test()后,class Test就是一个运行时类,只不过他拥有Date的资源结构。所以谁被实例化,谁就是一个运行时类。
最后,如果想要从Test中得到Date.class,可以用this.getClass().getSuperclass();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2