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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 零敢 中级黑马   /  2014-1-7 18:46  /  2084 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近看到两个Java基础题,自己搞了半天糊里糊涂的,看来自己Java基础还有很多理解不到位,希望高手给俺讲讲!
Java代码  收藏代码
class A {}  
class B extends A {  
  void print() {  
    System.out.println(super.getClass().getName());  
  }  
  public static void main(String[] args) {  
    B b = new B();  
    b.print();  
  }  
}  

输出结果是什么?为什么?

4 个回复

倒序浏览
输出结果为B,super.getClass().getName(),涉及到反射,super.getClass()获得父类对象A的Class对象,再调用Class类里面的getName()方法,获得此 Class 对象所表示的实体(类)名称。
super关键字的使用:使用super关键字可以从子类中调用父类中的构造方法,普通方法和属性,在使用super调用父类的构造方法时,必须将super语句放在子类构造方法的首行
回复 使用道具 举报
getClass在Object中的定义为 public final native Class<?> getClass();既然定义为final说明这个方法可以继承但不能重写,既然没有重写,那么调用this.getClass()和调用

super.getClass()都是一样调用Object中的本地方法getClass()。所以我们只需知道getClass()是怎么实现的就可以了.

getClass又是object中的final方法,其返回的是Runtime class,这是规范定义好了的,而你的runtime class的实例是B,所以返回的class对象是B.class

回复 使用道具 举报
class A {}  
class B extends A {  
  void print() {  
    System.out.println(super.getClass().getName());  
  }  
  public static void main(String[] args) {  
    B b = new B();  
    b.print();  
  }  
}  
这个问题只要弄清一个件事,你可以查一下JDK中的Object的getClass()方法。该方法是返回运行时的类
由此可见,该运行时的类时B类。super.getClass()获得的是B的Class对象,然后打印B的完整名称
回复 使用道具 举报
打印出来的是B。你很疑惑不是A?当你用super调用父类的方法,面程序中没有运行,那么super.getClass()获取到的是:Class<?>中的 getClass() 方法  返回此 Object 的运行时类。 你这程序用this和super是同一个效果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马