黑马程序员技术交流社区

标题: 继承的一个问题 [打印本页]

作者: 吴刚    时间: 2013-5-29 00:36
标题: 继承的一个问题
本帖最后由 吴刚 于 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,我表示很凌乱啊凌乱啊..




作者: 神之梦    时间: 2013-5-29 00:40
本帖最后由 神之梦 于 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,所以答案自然是传值后的了
作者: Super_Class    时间: 2013-5-29 00:52
多态:
编译看左边,运行看右边。基本解决你大多数问题
作者: FantasticPie    时间: 2013-5-29 01:01
你的这段代码很好解释。首先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的引用类型,这句话不理解没关系,看下多态的知识。
作者: 吴刚    时间: 2013-5-29 11:43
谢谢楼上.....




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