主题:[原创]java陷阱一
java陷阱一
我的网址:www.javaedu.com.cn
QQ:2535279
QQ:841403798
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
答案:e
解析:这道题综合考查了好几个知识点,如调用子类的构造方法时会先调用父类的构造方法;如果在子类的构造方法中没有显式调用父类的构造方法,那么创建子类的实例时会先调用父类的缺省构造方法;方法的动态绑定。
以上代码创建的是Extension类的实例,所以在运行时,所有调用add()方法的过程,将始终和Extension类的add()方法动态绑定。以下是程序依次对变量i的改变过程。
初始值:i = 0;
step1:创建实例new Extension()
先调用父类的缺省构造方法Base(),父类的缺省构造方法中执行add(1),i=0+1*2 -> i=2,再调用子类的缺省构造方法Extension(),子类的缺省构造方法中执行add(2),i=2+2*2 -> i=6.
step2:执行add(8)
i=6+8*2 -> i=22
更多java学习资料尽在网址:www.javaedu.com.cn
我的网址:www.javaedu.com.cn
QQ:2535279
QQ:841403798
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
答案:e
解析:这道题综合考查了好几个知识点,如调用子类的构造方法时会先调用父类的构造方法;如果在子类的构造方法中没有显式调用父类的构造方法,那么创建子类的实例时会先调用父类的缺省构造方法;方法的动态绑定。
以上代码创建的是Extension类的实例,所以在运行时,所有调用add()方法的过程,将始终和Extension类的add()方法动态绑定。以下是程序依次对变量i的改变过程。
初始值:i = 0;
step1:创建实例new Extension()
先调用父类的缺省构造方法Base(),父类的缺省构造方法中执行add(1),i=0+1*2 -> i=2,再调用子类的缺省构造方法Extension(),子类的缺省构造方法中执行add(2),i=2+2*2 -> i=6.
step2:执行add(8)
i=6+8*2 -> i=22
更多java学习资料尽在网址:www.javaedu.com.cn