/*********************************************************************************
下面的程序,让我想了好长时间,但是还是想不通,请各位指点一下程序的执行过程
为什么会输出25呢?
我认为的执行过程是:<1>先执行:aa vj=new aa(2) 则aa类的age变量为:20
<2>:再执行bb s=new bb(25) 此时先初始化父类构造方法也就是说aa类变量age变量为:0
<3>初始化子bb类的构造函数bb(int j),此时bb类的变量age等于25
<4>再执行:s.cc();输出super.age 则应该输出0为什么会输出25呢?
***********************************************************************************/
public class aa
{
protected int age;
aa()
{
}
aa(int i)
{
this.age=i;
}
}
class bb extends aa
{
bb(int j)
{
this.age=j;
}
void cc()
{
System.out.println(super.age);//这个地方应该输出0的啊,为什么输出25呢?
}
public static void main(String args[])
{
aa v=new aa(20);
bb s=new bb(25);
s.cc();
}
}

解决方案 »

  1.   

    当然不会输出为0了,你认为会调用基类的构造函数吗?
    你的派生类的构造函数都没有super...的语句.
      

  2.   

    LZ的理解的第三步有问题,
    bb(int j)
    {
    this.age=j;
    }
    已经把age的值变成25了,不管你是调用super.age,还是直接输出age,都是25
      

  3.   

    public class aa
    {
    protected int age;
    aa()
    {
    }
    aa(int i)
    {
    this.age=i;
    }
    }
    class bb extends aa
    {
    protected int age ;
    bb(int j)
    {
    this.age=j;
    }
    void cc()
    {
    System.out.println(super.age);//这个地方应该输出0的啊,为什么输出25呢?
    }
    public static void main(String args[])
    {
    aa v=new aa(20);
    bb s=new bb(25);
    s.cc();
    }
    }
    改成这样就是你说得那样了。
      

  4.   

    void cc() {
      System.out.println(super.age);// 这个地方应该输出0的啊
      System.out.println(this.age);//这个地方应该输出25的啊
    }经过你的继承,其实bb已经有了2个同名变量,super.age和this.age,而bb s=new bb(25);只能改变this.age,super.age你并未改变他的默认值0!
      

  5.   

    二楼和三楼说的正确,你这里是子类继承了父类里的Age成员变量,那么你在子类里对他进行操作了,这个变量的 值就发生了改变了。而如果你不是继承父类的成员变量而是重写了他,那么如果你想访问父类的这个变量可用super 访问。
      

  6.   

    想要得到父类的变量就不能这样了
    你得重新声明int age,表明是子类的变量而不是重写父类的变量,这样调用super.age就是0了。
      

  7.   

    对象初始化分为两部分:
    1 父类
    2 自己是一个递归的过程,Object没有父类,但是其它类都有自己定义的父类或者默认继承的Object父类所以,直到Obejct的部分完成初始化之后,才算父类对象构建完毕
      

  8.   

    bb s=new bb(25);语句在内存中只产生一个空间来存放age变量
    对于super.age和this.age指向的是同一块 内存地址,因为在bb类中并没有定义名为age的变量
    所以super.age和this.age指向 的就是bb类的实例从aa类继承来的age变量,所以输出是25,
    注: 如果在子类bb中定义了和父类同名的变量age的话,父类aa的变量age将被遮盖,那时
        super.age=0    this.age=25