class Base {
int i;
Base() {
add(1);
}
void add(int v) {
i += v;
}
void print() {
System.out.println(i);
}
}
class Extension extends Base {
Extension() {
add(2);
}
void add(int v) {
i += v*2;
}
}
public class Qd073 {
public static void main(String args[]) {
bogo(new Extension());
}
static void bogo(Base b) {
b.add(8);
b.print();
}
}
a) 9
b) 18
c) 20
d) 21
e) 22
答案为什么是22 求解释
8 个解决方案
#1
调用Extension的构造函数时,先调用Base的构造函数。所有的add调用Extension里面的add方法。
可以自己debug看看的额。
可以自己debug看看的额。
#2
new Extension() 会调用 构造函数
Extension() {
add(2);
}
构造函数会调用父类构造函数
Base() {
add(1);
}
然后会调用add(1),此时是调用子类的函数
void add(int v) {
i += v*2;
}
因为初始化时i是0,所以此时i=0+1*2=2
然后父类构造函数结束,回到子类构造函数,继续调用
add(2) 会调用
void add(int v) {
i += v*2;
}
因为父类构造函数结束时,i的值为2,所以此时i=2+2*2=6
然后主程序调用
b.add(8);
这是会调用子类的add方法
void add(int v) {
i += v*2;
}
所以 i=6+8*2=22
Extension() {
add(2);
}
构造函数会调用父类构造函数
Base() {
add(1);
}
然后会调用add(1),此时是调用子类的函数
void add(int v) {
i += v*2;
}
因为初始化时i是0,所以此时i=0+1*2=2
然后父类构造函数结束,回到子类构造函数,继续调用
add(2) 会调用
void add(int v) {
i += v*2;
}
因为父类构造函数结束时,i的值为2,所以此时i=2+2*2=6
然后主程序调用
b.add(8);
这是会调用子类的add方法
void add(int v) {
i += v*2;
}
所以 i=6+8*2=22
#3
add方法被重写了,初始化子类的时候先去初始化父类,调用的add方法是重写后的,所以
1×2+2×2+8×2
1×2+2×2+8×2
#4
new Extension() ==> 先调用父类的构造函数,再执行自己的构造。
因为子类中重写了 add 方法,父类中的 add 方法被覆盖。
所以,
Base() {
add(1);
}
和
Extension() {
add(2);
}
中调用的add方法,均是
void add(int v) {
i += v*2;
}
因为子类中重写了 add 方法,父类中的 add 方法被覆盖。
所以,
Base() {
add(1);
}
和
Extension() {
add(2);
}
中调用的add方法,均是
void add(int v) {
i += v*2;
}
#5
呵呵,手慢了。

2楼 阿宝 说的比我好。

2楼 阿宝 说的比我好。

#6
new Extention的时候
先执行父类Base的构造方法,构造方法中执行了父类的add(1)方法,i执行前为0,执行后为1;
再执行自己构造方法中的其他代码,也就是自己的add(2),i执行前为1,执行后为2*2+1=5;
把这个Extention赋值给Base变量b,执行bogo方法;
b.add方法重载为执行Extention中的add方法i为5+8*2=21;
print方法执行Base中的print方法,打印出i应该为21
先执行父类Base的构造方法,构造方法中执行了父类的add(1)方法,i执行前为0,执行后为1;
再执行自己构造方法中的其他代码,也就是自己的add(2),i执行前为1,执行后为2*2+1=5;
把这个Extention赋值给Base变量b,执行bogo方法;
b.add方法重载为执行Extention中的add方法i为5+8*2=21;
print方法执行Base中的print方法,打印出i应该为21
#7
看来我错了,父类的构造方法执行了子类中重写的方法
#8
神马都是浮云,唯有DEBUG能给你真相
#1
调用Extension的构造函数时,先调用Base的构造函数。所有的add调用Extension里面的add方法。
可以自己debug看看的额。
可以自己debug看看的额。
#2
new Extension() 会调用 构造函数
Extension() {
add(2);
}
构造函数会调用父类构造函数
Base() {
add(1);
}
然后会调用add(1),此时是调用子类的函数
void add(int v) {
i += v*2;
}
因为初始化时i是0,所以此时i=0+1*2=2
然后父类构造函数结束,回到子类构造函数,继续调用
add(2) 会调用
void add(int v) {
i += v*2;
}
因为父类构造函数结束时,i的值为2,所以此时i=2+2*2=6
然后主程序调用
b.add(8);
这是会调用子类的add方法
void add(int v) {
i += v*2;
}
所以 i=6+8*2=22
Extension() {
add(2);
}
构造函数会调用父类构造函数
Base() {
add(1);
}
然后会调用add(1),此时是调用子类的函数
void add(int v) {
i += v*2;
}
因为初始化时i是0,所以此时i=0+1*2=2
然后父类构造函数结束,回到子类构造函数,继续调用
add(2) 会调用
void add(int v) {
i += v*2;
}
因为父类构造函数结束时,i的值为2,所以此时i=2+2*2=6
然后主程序调用
b.add(8);
这是会调用子类的add方法
void add(int v) {
i += v*2;
}
所以 i=6+8*2=22
#3
add方法被重写了,初始化子类的时候先去初始化父类,调用的add方法是重写后的,所以
1×2+2×2+8×2
1×2+2×2+8×2
#4
new Extension() ==> 先调用父类的构造函数,再执行自己的构造。
因为子类中重写了 add 方法,父类中的 add 方法被覆盖。
所以,
Base() {
add(1);
}
和
Extension() {
add(2);
}
中调用的add方法,均是
void add(int v) {
i += v*2;
}
因为子类中重写了 add 方法,父类中的 add 方法被覆盖。
所以,
Base() {
add(1);
}
和
Extension() {
add(2);
}
中调用的add方法,均是
void add(int v) {
i += v*2;
}
#5
呵呵,手慢了。

2楼 阿宝 说的比我好。

2楼 阿宝 说的比我好。

#6
new Extention的时候
先执行父类Base的构造方法,构造方法中执行了父类的add(1)方法,i执行前为0,执行后为1;
再执行自己构造方法中的其他代码,也就是自己的add(2),i执行前为1,执行后为2*2+1=5;
把这个Extention赋值给Base变量b,执行bogo方法;
b.add方法重载为执行Extention中的add方法i为5+8*2=21;
print方法执行Base中的print方法,打印出i应该为21
先执行父类Base的构造方法,构造方法中执行了父类的add(1)方法,i执行前为0,执行后为1;
再执行自己构造方法中的其他代码,也就是自己的add(2),i执行前为1,执行后为2*2+1=5;
把这个Extention赋值给Base变量b,执行bogo方法;
b.add方法重载为执行Extention中的add方法i为5+8*2=21;
print方法执行Base中的print方法,打印出i应该为21
#7
看来我错了,父类的构造方法执行了子类中重写的方法
#8
神马都是浮云,唯有DEBUG能给你真相