黑马程序员技术交流社区

标题: 关于继承的getSuperclass()和super问题。 [打印本页]

作者: 杨文宇    时间: 2012-8-4 22:54
标题: 关于继承的getSuperclass()和super问题。
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();
        }
}
作者: 瞿乐    时间: 2012-8-4 23:01
本帖最后由 瞿乐 于 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 然后打印名字。

这个鄙人之见,第一个问题不太确定,纯属个人理解。希望对楼主有所帮助





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