Given:
public class App {
String myStr = "7007";
public void doStuff(String str) {
int myNum = 0;
try {
String myStr = str;
myNum = Integer.parseInt(myStr);
} catch (NumberFormatException ne) {
System.err.println("Error");
}
System.out.println("myStr: " + myStr + ", myNum: " + myNum);
}
public static void main(String[] args) {
App obj = new App();
obj.doStuff("9009");
}
}
What is the result?
A.
myStr: 9009, myNum: 9009
B.
myStr: 7007, myNum: 7007
C.
myStr: 7007, myNum: 9009
D. Compilation fails
題解
程式第8行的「myStr」變數會遮蔽(shadow)掉第3行同名的「myStr」物件變數,作用範圍只在第8~9行的程式區塊內。在第9行會將字串「9007」轉成整數,並把轉好的整數數值儲存在第6行宣告的myNum變數中,這部份是沒問題的。在程式執行到第12行之後,「myStr」所指的是第3行的「myStr」物件變數,所以此時「myStr」存的是字串「7007」,而「myNum」存的是整數「9009」。