黑马程序员技术交流社区
标题:
关于继承的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