BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #18797同步于 2011/6/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求解释(java源码执行结果)

welcome2008
2011/6/13镜像同步11 回复
class Base { int i; Base() { add(1); } public void add(int j) { i += j; } void print() { System.out.println(i); } } public class Test extends Base { public void add(int v) { i += 2 * v; } public static void main(String[] args) { bogo(new Test()); } public Test() { add(2); } static void bogo(Base b) { b.add(8); b.print(); } } 执行结果是22,好像是父类初始化时调用的add(1)调用的不是父类的方法,而是子类的add方法,为何?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
buptlong机器人#1 · 2011/6/13
看起来确实是调用的子类的add方法 不知为何 【 在 welcome2008 ( 我想我会一直孤单) 的大作中提到: 】 : class Base { : int i; : Base() { : ...................
aishangby机器人#2 · 2011/6/13
add不是个函数么?这样的话,在子类重新实现父类的函数,应该是覆盖了吧,这样在子类里面调用这个函数,应该就是子类实现的add。 而构造函数在生成子类对象的时候需要调用父类的构造函数,而关于像add这样的普通函数,只能调用在最后一个类里实现的代码吧。当然除非函数前面指定调用函数所属的类名,可以改变调用顺序。
buptaa机器人#3 · 2011/6/14
【 在 welcome2008 的大作中提到: 】 : class Base { : int i; : Base() { : ................... Effect Java里的某条建议:构造函数里永远不要调用可能被子类覆盖的方法。 因为子类初始化时会调用父类的构造函数,然后调用子类里的覆盖方法,而此时子类并没有初始化完全,如果调用了子类还未初始化的域或方法,就会有BUG!
buptlong机器人#4 · 2011/6/14
mark 【 在 buptaa (---Jay--- ) 的大作中提到: 】 : Effect Java里的某条建议:构造函数里永远不要调用可能被子类覆盖的方法。 : 因为子类初始化时会调用父类的构造函数,然后调用子类里的覆盖方法,而此时子类并没有初始化完全,如果调用了子类还未初始化的域或方法,就会有BUG!
ox机器人#5 · 2011/6/14
我有这书,想看自取 【 在 buptlong (楚|火属性的小龙|八卦帮之山火贲) 的大作中提到: 】 : mark
buptlong机器人#6 · 2011/6/14
高性能java 中文叫这个? 【 在 ox (小贝) 的大作中提到: 】 : 我有这书,想看自取
ox机器人#7 · 2011/6/14
没有中文名 【 在 buptlong (楚|火属性的小龙|八卦帮之山火贲) 的大作中提到: 】 : 高性能java : 中文叫这个?
buptlong机器人#8 · 2011/6/14
别说是全英文的书 【 在 ox (小贝) 的大作中提到: 】 : 没有中文名
a789asd456fg机器人#9 · 2011/6/14
我感觉,在执行构造方法之前,父类对象和子类对象已经创建,而构造器的作用一是返回已创建好的对象,二是可以初始化成员变量或其他工作,也就是对象在构造器运行之前已经创建,调用父类被子类重写的方法,就会执行子类的方法。