返回信息流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方法,为何?
这是一条镜像帖。来源:北邮人论坛 / java / #18797同步于 2011/6/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求解释(java源码执行结果)
welcome2008
2011/6/13镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
看起来确实是调用的子类的add方法
不知为何
【 在 welcome2008 ( 我想我会一直孤单) 的大作中提到: 】
: class Base {
: int i;
: Base() {
: ...................
add不是个函数么?这样的话,在子类重新实现父类的函数,应该是覆盖了吧,这样在子类里面调用这个函数,应该就是子类实现的add。
而构造函数在生成子类对象的时候需要调用父类的构造函数,而关于像add这样的普通函数,只能调用在最后一个类里实现的代码吧。当然除非函数前面指定调用函数所属的类名,可以改变调用顺序。
【 在 welcome2008 的大作中提到: 】
: class Base {
: int i;
: Base() {
: ...................
Effect Java里的某条建议:构造函数里永远不要调用可能被子类覆盖的方法。
因为子类初始化时会调用父类的构造函数,然后调用子类里的覆盖方法,而此时子类并没有初始化完全,如果调用了子类还未初始化的域或方法,就会有BUG!
mark
【 在 buptaa (---Jay--- ) 的大作中提到: 】
: Effect Java里的某条建议:构造函数里永远不要调用可能被子类覆盖的方法。
: 因为子类初始化时会调用父类的构造函数,然后调用子类里的覆盖方法,而此时子类并没有初始化完全,如果调用了子类还未初始化的域或方法,就会有BUG!
我感觉,在执行构造方法之前,父类对象和子类对象已经创建,而构造器的作用一是返回已创建好的对象,二是可以初始化成员变量或其他工作,也就是对象在构造器运行之前已经创建,调用父类被子类重写的方法,就会执行子类的方法。