Q22
What will be written to the standard output when the following program is run? 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();
}
} 1) 9
2) 18
3) 20
4) 21
5) 22 答案是:5)22
我运行了程序,正是答案是正确的。
但就是不知道为什么,各位朋友帮帮忙!
谢谢
What will be written to the standard output when the following program is run? 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();
}
} 1) 9
2) 18
3) 20
4) 21
5) 22 答案是:5)22
我运行了程序,正是答案是正确的。
但就是不知道为什么,各位朋友帮帮忙!
谢谢
static void bogo(Base b) {
b.add(8);
b.print();
}
中的b,不是在编译期就进行绑定了吗?她调用的应该是变量所属类型的那个类中的方法,也就是Base中的add方法啊。
非静态函数是在运行时绑定,根据持有变量的真正对象来决定调用的方法。
但是,这是静态方法啊~~~
int i;
Base() { //第一步:先构造父类
add(1); //调用父类中的add方法
}
void add(int v) { //第二步:结果使得i=1
i += v;
}
void print() {
System.out.println(i);
}
}
class Extension extends Base {
Extension() { //第三步:再构造子类
add(2); //调用子类中的add方法
}
void add(int v) { // //第四步:结果使得i=1+2*2=5
i += v*2;
}
}
public class Qd073 {
public static void main(String args[]) {
bogo(new Extension());
}
static void bogo(Base b) {
b.add(8); //第五步:调用Base也就是父类中的add方法,使得i=5+8=13
b.print(); //第六步:打印13。才发现选项中居然没有13,晕死!!!看来错得很离谱啊!!
}
} 哪位朋友能像我这种形式给出解释,就马上结贴!
int i; //i被初始化为0
Base() {
add(1); //add()被子类重写了, 因此调用子类的add(), i为0+1*2=2
}
void add(int v) {
i += v;
}
void print() {
System.out.println(i);
}
} class Extension extends Base {
Extension() {
////先调用父类构造函数, 得i=2
add(2); //调用add(), 得i=2+2*2=6
}
void add(int v) {
i += v*2;
}
}
public class Qd073 {
public static void main(String args[]) {
bogo(new Extension()); //new Extension()的i已经是6, 再被b.add()调用, 得6+16=22
}
static void bogo(Base b) {
b.add(8); //调用Extension类中的add()方法, 即b.i = b.i + 8 * 2 = b.i + 16
b.print();
}
} 结果为22.