请教一个java初级问题

老俊说技术 2009-06-28 07:23:28
class Foo { 
public Integer a;
public Foo() { a = 3; }
public void addFive() { a += 5; }
}
public class Bar extends Foo {
public Integer a;
public Bar() { a = 8; }
public void addFive() { a +=5; }
public static void main(String[] args){
Foo f=new Bar();
f.addFive();
System.out.println(f.a);
}
}


为什么这个的输出结果是3;请详细解释,谢谢
...全文
380 43 打赏 收藏 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxcv991 2009-11-16
  • 打赏
  • 举报
回复
不错
zj370159662 2009-11-16
  • 打赏
  • 举报
回复
学习
icekay Song 2009-11-16
  • 打赏
  • 举报
回复
受教..
haiaiwoaaaa 2009-11-16
  • 打赏
  • 举报
回复
我 怎么感觉是 13啊...
iter_jsx 2009-11-15
  • 打赏
  • 举报
回复
父类应用指向子类对象
jjj3751386 2009-11-15
  • 打赏
  • 举报
回复
学习了,又复习了一次多态~
godismydaughter 2009-11-15
  • 打赏
  • 举报
回复
又复习了一次多态。
zzz_robinson 2009-11-15
  • 打赏
  • 举报
回复
学习ing
kuruby 2009-11-15
  • 打赏
  • 举报
回复
很有意思的一个问题,学习了。
vs198611 2009-11-10
  • 打赏
  • 举报
回复
楼上多正解
xiaohongboabcd 2009-11-10
  • 打赏
  • 举报
回复
 
class Foo {
public Integer a;
public Foo() { a = 3; }
public void addFive() { a += 5; }
}
public class Bar extends Foo {
public Integer a;
public Bar () { a = 8; }
public void addFive() { a +=5; }
public static void main(String[] args){
Bar f=new Bar ();
Foo f1=new Bar ();
f1.addFive();
f.addFive();
System.out.println(f.a);
System.out.println("这个a是和父类绑定的:"+f1.a);
System.out.println("这个是和子类对象的实例绑定的:"+new Bar ().a);
}
}
这个就是涉及到多态,java虚拟机的绑定机制:
1、成员变量(静态和非静态)和静态方法都是和所声明的类型绑定(静态绑定,在编译期就绑定了)如你开始声明类型是FOO类型的,所以a和父类绑定。
2、实例方法是和实际声明的对像绑定的(动态绑定,运行时进行绑定),所以你调用的时候就是调用的子类的addFive()方法,这个就是原因了。不知道对不?
Eden_812 2009-11-10
  • 打赏
  • 举报
回复
public int addFive() { return a += 5; }
}
taoyuan1682001 2009-09-17
  • 打赏
  • 举报
回复
public static void main(String[] args) {
Bar b = new Bar();
Foo f = b;
f.addFive();//实现了动态绑定,编译器从子类中中该方法,如果找不到,再去父类中找这个方法.(Bar中的a被加上5(8+5),而Foo中的a没有改变值,还是(a=3)).
System.out.println(f.a);//字段没有多态,所以指向的是父类总的a变量(此时Bar中的a是13,只是没有打印)
System.out.println(b.a);//此时Bar中的a是13
}
m_angle_m 2009-09-17
  • 打赏
  • 举报
回复
f.a在编译的时候就已经确定了,它不具有多态性,是编译器绑定,在编译的时候已经确定调用的就是父类的a成员
libingyang860917 2009-09-11
  • 打赏
  • 举报
回复
new Bar() 的时候会有两个a变量,一个是自己的,一个是超类的初始化为3 ,当掉用方法addFive 时 :f指向的是 Bar的一个实例,所以调用的是Bar 里面的方法 改变了Bar的变量a的值,而另外一个超类的初始化为3的值没有改变。
louisgarcia 2009-09-11
  • 打赏
  • 举报
回复
学习了
KHacker_001 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 steedhorse 的回复:]
Foo.a跟Bar.a不是一个a,成员变量只有隐藏(hide),没有覆盖(override)。
但成员函数有覆盖,因此执行的是Bar的addFive。
于是这个程序的效果就变成了:把Bar.a加上5,然后打印Foo.a。
[/Quote]很好 学习了
happyworld1 2009-07-15
  • 打赏
  • 举报
回复
bar继承foo f.a其实就是super().a;而父亲 中的a a的值就是
catici 2009-07-08
  • 打赏
  • 举报
回复
貌似是 直接调用父类的 无参构造函数吧

有参构造函数需要有参数才能调用……
一时懿亮 2009-07-08
  • 打赏
  • 举报
回复
声明Foo f的时候,调用了Foo类中的构造,完成了Foo类中a的初始化。
加载更多回复(23)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧