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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴刚 中级黑马   /  2013-5-29 00:36  /  1205 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴刚 于 2013-5-29 11:43 编辑

  1. <DIV class=blockcode>
  2. <BLOCKQUOTE>
  3. <BLOCKQUOTE>
复制代码


class A
{
  int i =5;
}

class B extends A{
public B(){
  i = 7;
}
}
public class Demo1 {

/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  A a = new B();
  System.out.println(a.i);
}

}

输入的结果是7!!!
我问了很多人,给了我好几种解释
老湿说过成员变量编译看左边,运行看左边,所以我一直认为是5啊,结果问了下同学,自己又思考了下,难道是因为子类和父类共用一个成员变量i吗?但是又有别的同学告诉我说输出a.i的a本质是B类型,所以本质上输出的就是B.i,我表示很凌乱啊凌乱啊..



评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
本帖最后由 神之梦 于 2013-5-29 00:45 编辑

答案是7
因为子类中没有重新定义变量i
如果子类中是这样:
class B extends A{
public B(){
  int i = 7;
}
}
那答案就是5,而楼主的是这样的:
class B extends A{
public B(){
   i = 7;
}
}
楼主在子类构造方法中操作的是父类中定义的变量i,即使父类中初始化是5,在new B()的时候,子类 继承过来之后,传了一个7给i,所以答案自然是传值后的了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
多态:
编译看左边,运行看右边。基本解决你大多数问题
回复 使用道具 举报
你的这段代码很好解释。首先B是A的子类,这样B拥有A类所有的非私有的成员变量。明白了这个问题来看主函数,创建了一个B的对象,这就用到了成员变量的初始化的顺序问题:先初始化成员变量,再执行构造方法,因此i的值先是5后变为7,看下下面的打印结果为5和 7.
  1. class A {
  2.     int i = 5;
  3. }

  4. class B extends A {
  5.     public B() {
  6.         System.out.println(i);
  7.         i = 7;
  8.     }
  9. }

  10. public class Demo1 {
  11.     public static void main(String[] args) {
  12.         // TODO Auto-generated method stub
  13.         A a = new B();
  14.         System.out.println(a.i);
  15.     }
  16. }
复制代码
解决打印i值问题只要明白上面的就好了。
你的同学说a.i的a本质是B类型是对的,实际操作的是B的对象,只是它是父类A的引用类型,这句话不理解没关系,看下多态的知识。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 你这家伙能突破40

查看全部评分

回复 使用道具 举报
谢谢楼上.....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马