场景:
在练习错题
错题描述:
下面程序的运行结果是:( )
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong() {
System.out.print("pong");
}
}
选项
A.pingpong
B.pongping
C.pingpong和pongping都有可能
D.都不输出
E.pong
F.ping
原因分析:
t.run是调用的Thead类中的run()方法,t.start才是执行线程,
所以这题就是执行普通run()方法,先输出pong,在输出ping。
答案:B
错题描述2:
Test.main()函数执行后的输出是( )class Test {
public static void main(String[] args) {
System.out.println(new B().getValue());
}
static class A {
protected int value;
public A (int v) {
setValue(v);
}
public void setValue(int value) {
this.value= value;
}
public int getValue() {
try {
value ++;
return value;
} finally {
this.setValue(value);
System.out.println(value);
}
}
}
static class B extends A {
public B () {
super(5);
setValue(getValue()- 3);
}
public void setValue(int value) {
super.setValue(2 * value);
}
}
}
选项:
A.6 7 7
B.22 34 17
C.22 74 74
D.11 17 34
原因分析:
首先,在main函数中,【new B()】new了一个B类的实例化对象,在实例化对象时,调用了B类中的构造函数,执行【super(5)】,也就是public A(int v)------>setValue(v),由于调用的方法必须是实例化子类中重写的方法的原则。因此,这里调用的是B类中的setValue(v)方法,此时B实例的value值设置为2 x 5 = 10,后执行super.setValue(10),将value=10的值存储起来。
执行完super(5)后,执行构造函数中的【setValue(getValue()- 3)】中【getValue()】,由于B类中没有getValue()方法,则调用父类(A类)中的getValue()方法,value++所得到的值为11,并存储在value中(先执行finally中的部分,后执行try中的return),在finally中,调用了【this.setValue(value)】,由于调用的方法必须是实例化子类中重写的方法的原则,调用的是B类中的setValue(v)方法,此时B实例的value值设置为2 x 11= 22,之后执行System.out.println(value),即在控制台上打印22;
执行完finally中的部分,后执行try中的return,将value++执行后,存储在value中的11,return回去;执行【setValue(getValue()- 3)】,即:setValue(8)。
执行setValue(8)时,由于调用的方法必须是实例化子类中重写的方法的原则,则调用B类中的setValue(v)方法,此时B实例的value值设置为2 x 8= 16;此时B类中的构造函数执行结束。
在实例化对象以后,执行【new B().getValue()】,由于B类中没有getValue()方法,则调用父类(A类)中的getValue()方法,value++所得到的值为17,并存储在value中,在finally中,调用了【this.setValue(value)】,由于调用的方法必须是实例化子类中重写的方法的原则,调用的是B类中的setValue(v)方法,此时B实例的value值设置为2 x 17= 34,之后执行System.out.println(value),即在控制台上打印34;
执行完finally中的部分,后执行try中的return,将value++执行后,存储在value中的17,return回去;执行【System.out.println(new B().getValue())】,即在控制台上打印17。
答案:B