A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张豪杰 中级黑马   /  2013-2-26 23:05  /  1793 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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());

}

}

为什么输出的是子类不是父类?

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

3 个回复

倒序浏览
getClass返回的是此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

主函数里运行的是Test,所以是返回此对象运行时类的Class对象就是Test

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报

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:}

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王钊 于 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();

评分

参与人数 1黑马币 +12 收起 理由
Rancho_Gump + 12

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马