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」。