22.Given:
10. public class Foo {
11. public int a;
12. public Foo() { a = 3; }
13. public void addFive() { a += 5; }
14. }
and:
20. public class Bar extends Foo {
21. public int a;
22. public Bar() { a = 8; }
23. public void addFive() { this.a +=5; }
24. }
invoked with:
30. Foo foo = new Bar();
31. foo.addFive();
32. System.out.println( " Value: " + foo.a);
结果是什么?
A. Value: 3
B. Value: 8
C. Value: 13
D. Compilation fails.
E. The code runs with no output.
F. An exception is thrown at runtime.

解决方案 »

  1.   

    A,当调用子类构造函数构建子类对象的时候,必然会先调用父类的构造函数,即构建一个父类对象,因此父类的成员(变量和方法)也会被构建。如果存在同名,内存中将会同时存在父类的同名成员和子类的同名成员。由于Java的多态性只针对方法来说的,成员变量不存在多态,因此成员变量只与访问的变量类型有关,而方法的调用遵从多态的规则。
      

  2.   

    是F ,因为System.out.println( " Value: " + foo.a)这句话中,foo.a 可以看出其最后调用的是类Foo中的public Foo()方法,但是在 Foo foo = new Bar()中定义的是Bar类,所以应该先调用子类中的方法,由于子类中的方法是不能覆盖父类中的构造方法,所以最后在执行的时候抛出异常,即答案是F
      

  3.   

    la不防看看下面的程序。你就会很明白了:package csdn.demo;
    class Fu
    {
    public int a;
    public Fu(){
    a=3;
    System.out.println("父类的构造方法Fu()");
    }
    public void addValue(){
    System.out.println("父类的构造方法addValue()");
    a =a+3;
    }
    public int getA(){
    System.out.println("父类的方法getA()");
    return this.a;
    }
    };
    class Zi extends Fu
    {
    public int a;
    public Zi(){
    a = 8;
    System.out.println("子类的构造方法Zi()");
    }
    public void addValue(){
    this.a=a+5;
    System.out.println("子类的构造方法addValue()");
    }
    public int getA(){
    System.out.println("子类的方法getA()");
    return this.a;
    }
    };public class Csdndemo01 
    {
    public static void main(String[] args) 
    {
    Fu f = new Zi();
    f.addValue();
    System.out.println("a="+f.getB());
    }
    }(1)lz的问题就相当于把父类中的得到属性的方法改为getB().然后再分析就是了,这下你就明白二楼的意思了。
      

  4.   

    2楼4楼正解,解释的挺不错的!好好看看Java中多态吧:答案-A