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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨文宇 中级黑马   /  2012-8-4 22:54  /  1134 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Base{
        public Base(){
                // 这个为什么输出的不是Object的字节码名字?
                System.out.println(this.getClass().getSuperclass().getName());
        }
}
public class Test extends Base{
        public void method(){
                //    Base
                System.out.println( this.getClass().getSuperclass().getName() );
                // 为什么输出的是的字节码是Test,和上面有什么区别?
                System.out.println( super.getClass().getName());
        }
        public static void main(String[] args) {
                new Test().method();
        }
}

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 鼓励一下

查看全部评分

1 个回复

倒序浏览
本帖最后由 瞿乐 于 2012-8-5 00:48 编辑

不好意思,刚刚没有认真看题目,就回答了,认真看了一下,这个题目很有意思。和张老师的题目很相似,不过比张老师的那道题目还要好,哈哈~
执行 new Test().method(); 构造 Test类的时候会先执行Base类的无参构造函数,
由于没有new 对象,代码都在栈内存中,会找到栈内存中该类并执行它的getName()方法,返回该类的名字Base。

如果主函数中加一句new Base(); 这个对象会是在堆内存中开辟内存,继承了Object类, 该句代码会打印java.lang.Object。

之后 会执行Test的method()方法。第一句执行 this.getClass().getSuperclass().getName(),由于Test extends Base,这是很明显的继承了,通过this.getClass().getSuperclass()获取到了父类再通过getName()获取父类的名字了,这是毋庸置疑了。

接下来,执行 super.getClass().getName(),由于 由于getClass()在Object类中定义成了final,子类不能覆盖该方法
于是 super.getClass()返回的是当前类Test 然后打印名字。

这个鄙人之见,第一个问题不太确定,纯属个人理解。希望对楼主有所帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马