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);
}}
这个输出什么?为什么?如何调用的?请高手指点下
我的理解是new Bar()的时候,先实例父类Foo,这时候将父类Foo的a赋值为3,然后再实例化子类Bar,由于变量是没有多态的,所以子类的a值不能将父类的a的值更改,故输出为3.
调用了foo。addFive()方法,他更改的是子类bar的a值,这时候bar.a值为13.
Foo foo = new Bar();
改成
Bar foo = new Bar();//就可以得到13.
变量没有重载.
而foo.addFive调用的是子类的变量a
输出3
就已经决定了这里的a是父类中的变量a
而调用foo.addFive()是运行期绑定,在运行的时候调用的是Bar中的方法addFive(),所以+5的应该是子类中的a
Foo foo = new Bar();
这里有一个静态绑定,动态绑定的问题。foo.a在编译的时候就被指定为父类,foo.addFive();
子类方法重写父类方法同时满足父类引用指向子类实例,产生多态。
故子类的a在这个方法结束,值为13。System.out.println("Value: "+ foo.a);
foo.a还是指的父类,父类的值并没有发生改变..还是回到这里
foo.addFive();
该方法用了this,如果用super的话那么a的值.会改变成13.同时说明一下,父类的方法并没有起作用。
A a;
B b=new B();
a=b;
我们就称A类对象a是子类对象b的上传型对象。
而对于上传型对象有一个明显的要求就是如果子类重写了父类的某个方法后,对象的上传型对象调用这个方法时,一定是调用这个重写的方法。所以···foo.addFive()调用的是Bar中的方法addFive(),+5的应该是子类中的a。而对于foo.a的结果那自然是3了。
这个例子不错,还有一个想法,把父类中a的访问控制符改为private,再讨论下子类能不能继承父类的成员变量a,即在子类中的实例方法是否可以访问它。
a 不可以在Foo中访问privatee
最后一行程序出错,这说明Foo.a访问的是父类构造器的中的a,我把父类构造器删了。结果是0,
Foo foo = new Bar();
这里有一个静态绑定,动态绑定的问题。 foo.a在编译的时候就被指定为父类, foo.addFive();
子类方法重写父类方法同时满足父类引用指向子类实例,产生多态。
故子类的a在这个方法结束,值为13。 System.out.println("Value: "+ foo.a);
foo.a还是指的父类,父类的值并没有发生改变.. 还是回到这里
foo.addFive();
该方法用了this,如果用super的话那么a的值.会改变成13. 同时说明一下,父类的方法并没有起作用。
左边只是类型,右边的才是实例。