class Foo {
 public int a;
 public Foo() { a = 3; }
 public void addFive() { a += 5; }
}
public class Bar extends Foo{
public int a;
public Bar() { a = 8; }
public void addFive() { this.a +=5; }

public static void main(String[] args) {
Foo foo = new Bar();
 foo.addFive();
 System.out.println("Value: "+ foo.a);
}}
这个输出什么?为什么?如何调用的?请高手指点下

解决方案 »

  1.   

    输出3
    我的理解是new Bar()的时候,先实例父类Foo,这时候将父类Foo的a赋值为3,然后再实例化子类Bar,由于变量是没有多态的,所以子类的a值不能将父类的a的值更改,故输出为3.
      

  2.   

    不管子类父类,还调用了foo.addFive();方法阿
      

  3.   

    方法是有多态,变量没有
    调用了foo。addFive()方法,他更改的是子类bar的a值,这时候bar.a值为13.
      

  4.   


    Foo foo = new Bar();
    改成
    Bar foo = new Bar();//就可以得到13.
    变量没有重载.
      

  5.   

    正解,变量是没有后期绑定的(即运行期绑定),foo.a在编译的时候已经决定了要调用的是父类的变量a
    而foo.addFive调用的是子类的变量a
    输出3
      

  6.   

    可能解释的不是很清楚,在编译的时候看到System.out.println(“Value:”+foo.a);的时候
    就已经决定了这里的a是父类中的变量a
    而调用foo.addFive()是运行期绑定,在运行的时候调用的是Bar中的方法addFive(),所以+5的应该是子类中的a
      

  7.   

    正如上面各位大牛所说;
    Foo foo = new Bar();
    这里有一个静态绑定,动态绑定的问题。foo.a在编译的时候就被指定为父类,foo.addFive();
    子类方法重写父类方法同时满足父类引用指向子类实例,产生多态。
    故子类的a在这个方法结束,值为13。System.out.println("Value: "+ foo.a);
    foo.a还是指的父类,父类的值并没有发生改变..还是回到这里
    foo.addFive();
    该方法用了this,如果用super的话那么a的值.会改变成13.同时说明一下,父类的方法并没有起作用。
      

  8.   

       这里涉及到了对象的上传型对象,所谓上传型对象,例如:
     A a;
     B b=new B();
     a=b;
     我们就称A类对象a是子类对象b的上传型对象。
     而对于上传型对象有一个明显的要求就是如果子类重写了父类的某个方法后,对象的上传型对象调用这个方法时,一定是调用这个重写的方法。所以···foo.addFive()调用的是Bar中的方法addFive(),+5的应该是子类中的a。而对于foo.a的结果那自然是3了。
    这个例子不错,还有一个想法,把父类中a的访问控制符改为private,再讨论下子类能不能继承父类的成员变量a,即在子类中的实例方法是否可以访问它。
      

  9.   

    父类的变量foo.a是3,所以输出3.
      

  10.   

    确实很知道思考,楼上的讨论把父类中a的访问控制符改为private,所报错是在编译期就出了:
      a 不可以在Foo中访问privatee
    最后一行程序出错,这说明Foo.a访问的是父类构造器的中的a,我把父类构造器删了。结果是0,
      

  11.   

    正如上面各位大牛所说; 
    Foo foo = new Bar(); 
    这里有一个静态绑定,动态绑定的问题。 foo.a在编译的时候就被指定为父类, foo.addFive(); 
    子类方法重写父类方法同时满足父类引用指向子类实例,产生多态。 
    故子类的a在这个方法结束,值为13。 System.out.println("Value: "+ foo.a); 
    foo.a还是指的父类,父类的值并没有发生改变.. 还是回到这里 
    foo.addFive(); 
    该方法用了this,如果用super的话那么a的值.会改变成13. 同时说明一下,父类的方法并没有起作用。
      

  12.   

    实例化的是 Class Bar调用的当然是 子类(Bar)的方法啦。对于这个的语句:Foo foo = new Bar();不要被左边的Foo类型迷惑了。
    左边只是类型,右边的才是实例。