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()创建的!

解决方案 »

  1.   

    对象是由new C156()创建的,没错,
    foo.addFive();用了多态的知识,调用子类的方法。
    但foo.a是调用父类的成员变量,public int a;new子类的时候已经初始化父类了。
      

  2.   

    addFive()已经被子类重写,Fo foo=new C156()父类引用指向子类对象,对子类的成员a进行访问,foo.a实际上访问的是父类的成员a,父类引用只能看见自身成员
      

  3.   


    那子类定义的成员变量a和父类的变量a有关系吗?它会不会覆盖掉父类的a啊?
      

  4.   

    LZ把Fo的变量a改成b,然后就会发现foo.a会出现错误提示,证明什么?顺便说明一下,构造的时候,是从最顶层的类开始构造
    这里会先调用Fo的构造函数,然后再调用C156的构造函数如果你在吧C156的相加方法改成其他名字,你会发现他会去调用父类的相加方法这种问题还是单步调试看它的执行过程要清楚多
    我刚才就是这么做的
      

  5.   

    class Fo{
    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这样楼主能看懂吗?