黑马程序员技术交流社区

标题: 关于子父类中的super [打印本页]

作者: 郭娇珍    时间: 2012-12-28 20:49
标题: 关于子父类中的super
本帖最后由 郭娇珍 于 2012-12-29 18:11 编辑

class Demo
{         
public static void main(String[] args)
{         
  new Demo3().visit();     
}      
}
class Demo2
{     
  int a = 4;
  public void v()
  {         
   System.out.println(this.a);   
   System.out.println(this.getClass());
  }
}
class Demo3 extends Demo2
{     
  int a = 6;
  public void visit()
  {  
   super.v();
  }
}
帮忙看下它的结果为什么是4 Demo3呢

作者: 李方    时间: 2012-12-28 22:10
个人小理解啊。
Demo3的父类是Demo2,程序读到Demo时会继续读到D3,D3的父类是D2,当然继续读D2了,所以读a的值会是4。又因为是由D3才读到的D2,所以this.getClass中的this自然指的就是Demo3了。
作者: 王钊    时间: 2012-12-28 22:37
这个问题其实有点深度,我尽量说明白。。
返回4你应该明白吧,调用super()返回的是父类的a。
关键是第二个。
首先,要看看javaAPI文档怎么说的:返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
      什么是运行时类?!运行时类是Object的一个实例,注意,关键来了,他返回的不是Object.class,他返回的是运行时类,就是虚拟机中是谁在运行就是谁,如果你new Demo2(),Demo2当然是运行时类,而不是Demo3。
      根据上一段解释,Demo2是Object的子类,Demo2.getClass()返回的肯定是Demo2.class,
     同样Demo3继承Demo2,即使有一个属于Demo2的getClass()返回的也不可能是Demo2class,因为当new Demo3()后,Demo3就是一个运行时类,只不过他拥有Demo2的资源结构。所以谁被实例化,谁就是一个运行时类。
最后,如果想要从Demo3中得到Demo2.class,可以用Demo3.getClass().getSuperClass();
作者: 肖志锋    时间: 2012-12-28 22:38
这是一个继承的问题,涉及到一个父类子对象的概念,首先说那个a的问题,Demo3继承了Demo2,则它就有了Demo2的属性和方法,你这里Demo2的方法都是public或者默认的,可以直接访问。你可以理解为创建子类对象的时候,他里面有个父类的对象,对于属性来说,如果父类子类有一个相同名字的属性的话,规律就是,父类子对象访问这个属性,则先在父类里面找,找不到,再去子类找。子类访问这个属性,则先在子类找,找不到才去父类子对象找。套在你这里,则现在Demo2找,所以,a=4,
至于说所属类,就不用说了,必然是Demo3,你都没创建Demo2,只在创建Demo3的时候在其里面创建了一个父类的子对象而已,不可能会有引用的。
至于说方法多态的问题,后面你还会学到的。
作者: 冉世友    时间: 2012-12-28 23:56
这个问题弄清楚类加载器先后顺序就清晰了:

jvm的类加载器先加载带有main的类, new Demo3()后加载Demo3,此时a=6,由于Demo3继承了
Demo2,再去加载Demo2,此时a被重新赋值为4,由于Demo3的实例去调用的visit方法,所以最后
返回的.class 文件为Demo3.class。
作者: 郭娇珍    时间: 2012-12-29 18:10
本帖最后由 郭娇珍 于 2012-12-29 18:19 编辑
心犀香 发表于 2012-12-28 23:56
这个问题弄清楚类加载器先后顺序就清晰了:

jvm的类加载器先加载带有main的类, new Demo3()后加载Demo3, ...


嗯,这样子理解起来就清楚明了了,谢谢了
问题已经解决




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