package hqb;class Fo{
public int a;
public Fo(){
a=3;
}
public void addFive(){
a+=5;
}
}
public class C156 extends Fo{ /**
* @param args
*/
public int a;
public C156(){
a=8;
}
public void addFive(){
this.a+=5;
}
public static void main(String[] args) {
// TODO 自动生成方法存根
Fo foo=new C156();
foo.addFive();
System.out.println("value:"+foo.a); }}输出结果是3.
我认为应该是13,因为对象是由new C156()创建的!
public int a;
public Fo(){
a=3;
}
public void addFive(){
a+=5;
}
}
public class C156 extends Fo{ /**
* @param args
*/
public int a;
public C156(){
a=8;
}
public void addFive(){
this.a+=5;
}
public static void main(String[] args) {
// TODO 自动生成方法存根
Fo foo=new C156();
foo.addFive();
System.out.println("value:"+foo.a); }}输出结果是3.
我认为应该是13,因为对象是由new C156()创建的!
foo.addFive();用了多态的知识,调用子类的方法。
但foo.a是调用父类的成员变量,public int a;new子类的时候已经初始化父类了。
那子类定义的成员变量a和父类的变量a有关系吗?它会不会覆盖掉父类的a啊?
这里会先调用Fo的构造函数,然后再调用C156的构造函数如果你在吧C156的相加方法改成其他名字,你会发现他会去调用父类的相加方法这种问题还是单步调试看它的执行过程要清楚多
我刚才就是这么做的
public int a;
public Fo(){
a=3;
System.out.println("调用类Fo中无参构造方法"+a);
}
public void addFive(){
a+=5;
System.out.println("调用类Fo中addFive方法:"+this.a);
}
}
public class C156 extends Fo{ /**
* @param args
*/
public int a;
public C156(){
a=8;
System.out.println("调用类C156中无参构造方法"+a);
}
public void addFive(){
this.a+=5;
System.out.println("调用C156中addFive方法:"+this.a);
}
public static void main(String[] args) {
// TODO 自动生成方法存根
Fo foo=new C156();
System.out.println("foo.addFive()前,a的值为:"+foo.a);
foo.addFive();
System.out.println("value:"+foo.a); }}
运行结果:
调用类Fo中无参构造方法3
调用类C156中无参构造方法8
foo.addFive()前,a的值为:3
调用C156中addFive方法:13
value:3这样楼主能看懂吗?