/*********************************************************************************
下面的程序,让我想了好长时间,但是还是想不通,请各位指点一下程序的执行过程
为什么会输出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();
}
}
下面的程序,让我想了好长时间,但是还是想不通,请各位指点一下程序的执行过程
为什么会输出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();
}
}
你的派生类的构造函数都没有super...的语句.
bb(int j)
{
this.age=j;
}
已经把age的值变成25了,不管你是调用super.age,还是直接输出age,都是25
{
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();
}
}
改成这样就是你说得那样了。
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!
你得重新声明int age,表明是子类的变量而不是重写父类的变量,这样调用super.age就是0了。
1 父类
2 自己是一个递归的过程,Object没有父类,但是其它类都有自己定义的父类或者默认继承的Object父类所以,直到Obejct的部分完成初始化之后,才算父类对象构建完毕
对于super.age和this.age指向的是同一块 内存地址,因为在bb类中并没有定义名为age的变量
所以super.age和this.age指向 的就是bb类的实例从aa类继承来的age变量,所以输出是25,
注: 如果在子类bb中定义了和父类同名的变量age的话,父类aa的变量age将被遮盖,那时
super.age=0 this.age=25