一道关于initializer的SCJP题!

Patrick_DK 2002-01-05 04:05:23
class A {
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}

public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}
搞得头晕了,请问各位高手,
输出结果是什么,为什么?
...全文
542 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Patrick_DK 2002-01-08
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/463/463710.shtm

http://www.csdn.net/expert/topic/463/463555.shtm

bistar 2002-01-08
  • 打赏
  • 举报
回复
关注
baitianhai 2002-01-08
  • 打赏
  • 举报
回复
不错,不错
Nizvoo 2002-01-08
  • 打赏
  • 举报
回复
不错收藏
alula 2002-01-08
  • 打赏
  • 举报
回复
这题目说,在构造函数中调用成员方法不小心可能会有安全问题, 要小心.
foryouever 2002-01-07
  • 打赏
  • 举报
回复
同意楼上的。
首先,B继承A,要默认调用A的构造函数,也就是
public A() {
System.out.println("AAA");
doSomething();
}
可此时的doSomething()方法动态的绑定到B的对象上,实际上是执行的B中的doSomething()
方法。原因很简单,B继承了A,所以方法要动态绑定。但是这个时候B的对象还没有完成初始化,
所以Bvar值为0。
然后,再执行B对象的doSomething()方法,这个时候Bvar已经初始化完成了,所以打印Bvar=2222。
最后,执行System.out.println("Avar=" + Avar),由于A中doSomething()致始至终都没有执行,所以Avar值为0。

gularess 2002-01-07
  • 打赏
  • 举报
回复
AAA
Bvar=0
BBB
Bvar=2222
Avar=0

其实java的初始化与c++的初始化差不多,最好见Bruce Eckel大师的Thinking in java或Thinking in C++讲得非常清楚。
www.bruceechel.com上有电子版。
Patrick_DK 2002-01-07
  • 打赏
  • 举报
回复
pushpush
binghuodao 2002-01-07
  • 打赏
  • 举报
回复
好题呀,经典
cxy_ll 2002-01-07
  • 打赏
  • 举报
回复
是:
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
beaner 2002-01-07
  • 打赏
  • 举报
回复
输出结果:
BBB
Bvar=2222
Avar=0
Pasp 2002-01-07
  • 打赏
  • 举报
回复
我认为foryouever的解释不完全正确,
最后,执行System.out.println("Avar=" + Avar),由于A中doSomething()致始至终都没有执行,所以Avar值为0。

应该是B中最后Avar兜没有初始化,所以为0


Patrick_DK 2002-01-06
  • 打赏
  • 举报
回复
那文档看完了,感觉他没有讲到重点上,还是不容易理解.

我自己想了想,这里是不是用到了多态的动态绑定概念哦?不知道我想的对不对,请高手指教

因为A中的非static方法dosomething()被B中的覆盖了,由于是非static方法,必须运行期动态绑定,因此A类中的dosomething()实际没有执行,而是执行B中的覆盖方法dosomething().因此上面那个程序的输出结果为:
   AAA
    Bvar=0
    BBB
    Bvar=2222
    Avar=0

在上面的程序中,假设把属性Avar,Bvar和方法dosomething()全部加上static,那么由于是static方法的覆盖,在编译期绑定,所以执行的还是A类的dosomething().因此程序和输出结果如下:
class A
{
public static int Avar;
public A()
{
System.out.println("AAA");
doSomething();
}
public static void doSomething()
{
Avar = 1111;
System.out.println("A.doSomething()");
}
}

public class B extends A
{
public static int Bvar = 2222;
public B()
{
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public static void doSomething()
{
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args)
{
new B();
}
}
输出结果:
AAA
A.doSomething()
BBB
Bvar=2222
Avar=1111


以上就是我的认识,如果有不对的地方还请各位高手多多指教.

另外,关于多态的绑定,我有疑问,请去
http://www.csdn.net/expert/topic/458/458814.shtm
Patrick_DK 2002-01-06
  • 打赏
  • 举报
回复
看到了,谢谢.
Patrick_DK 2002-01-06
  • 打赏
  • 举报
回复
考,是没有找到啊,眼神不好行不行啊
caolyf 2002-01-06
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/Read_Article.asp?Id=11130

你也太懒了吧
xiaoyixiao 2002-01-06
  • 打赏
  • 举报
回复










AAA
Bvar=0
BBB
Bvar=2222
Avar=0







muly 2002-01-05
  • 打赏
  • 举报
回复
接上面
所以,先调用A的初始化方法A(),输出AAA,因为,A中的doSomething()在B中被重写
所以,调用B类中的doSomething()方法,输出Bvar=0(此时的public int Bvar = 2222;
并未执行)
接着调用B的初始方法,输出BBB,调用B中的doSomething()输出Bvar=2222(此时的public int Bvar = 2222;已执行),因为Avar变量在A中只被定义为整形,默认初始化值为0,所以
System.out.println("Avar=" + Avar);输出Avar=0

muly 2002-01-05
  • 打赏
  • 举报
回复
好题!不过并没那么晕.
因为B继承A
Patrick_DK 2002-01-05
  • 打赏
  • 举报
回复
没看到啊,给个具体地址啊,名字叫什么?
加载更多回复(11)

23,407

社区成员

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

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