黑马程序员技术交流社区

标题: 关于继承的问题 [打印本页]

作者: 零敢    时间: 2014-1-7 18:46
标题: 关于继承的问题
最近看到两个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();  
  }  
}  

输出结果是什么?为什么?
作者: tuanjie    时间: 2014-1-7 19:12
输出结果为B,super.getClass().getName(),涉及到反射,super.getClass()获得父类对象A的Class对象,再调用Class类里面的getName()方法,获得此 Class 对象所表示的实体(类)名称。
super关键字的使用:使用super关键字可以从子类中调用父类中的构造方法,普通方法和属性,在使用super调用父类的构造方法时,必须将super语句放在子类构造方法的首行
作者: 小悠久    时间: 2014-1-7 19:15
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


作者: IT人    时间: 2014-1-7 19:45
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的完整名称

作者: 快乐的黑马    时间: 2014-1-7 20:03
打印出来的是B。你很疑惑不是A?当你用super调用父类的方法,面程序中没有运行,那么super.getClass()获取到的是:Class<?>中的 getClass() 方法  返回此 Object 的运行时类。 你这程序用this和super是同一个效果





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