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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭娇珍 中级黑马   /  2012-12-28 20:49  /  1550 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭娇珍 于 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呢

评分

参与人数 1技术分 +2 收起 理由
奋斗的青春 + 2 赞一个!

查看全部评分

5 个回复

倒序浏览
李方 来自手机 中级黑马 2012-12-28 22:10:20
沙发
个人小理解啊。
Demo3的父类是Demo2,程序读到Demo时会继续读到D3,D3的父类是D2,当然继续读D2了,所以读a的值会是4。又因为是由D3才读到的D2,所以this.getClass中的this自然指的就是Demo3了。来自: Android客户端

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 很给力!

查看全部评分

回复 使用道具 举报
这个问题其实有点深度,我尽量说明白。。
返回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();

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是一个继承的问题,涉及到一个父类子对象的概念,首先说那个a的问题,Demo3继承了Demo2,则它就有了Demo2的属性和方法,你这里Demo2的方法都是public或者默认的,可以直接访问。你可以理解为创建子类对象的时候,他里面有个父类的对象,对于属性来说,如果父类子类有一个相同名字的属性的话,规律就是,父类子对象访问这个属性,则先在父类里面找,找不到,再去子类找。子类访问这个属性,则先在子类找,找不到才去父类子对象找。套在你这里,则现在Demo2找,所以,a=4,
至于说所属类,就不用说了,必然是Demo3,你都没创建Demo2,只在创建Demo3的时候在其里面创建了一个父类的子对象而已,不可能会有引用的。
至于说方法多态的问题,后面你还会学到的。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个问题弄清楚类加载器先后顺序就清晰了:

jvm的类加载器先加载带有main的类, new Demo3()后加载Demo3,此时a=6,由于Demo3继承了
Demo2,再去加载Demo2,此时a被重新赋值为4,由于Demo3的实例去调用的visit方法,所以最后
返回的.class 文件为Demo3.class。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 郭娇珍 于 2012-12-29 18:19 编辑
心犀香 发表于 2012-12-28 23:56
这个问题弄清楚类加载器先后顺序就清晰了:

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


嗯,这样子理解起来就清楚明了了,谢谢了
问题已经解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马