2014-12-04 71 views
0
public class MyClass { 

    public void display(String s) { 
     final char c = s.charAt(0); 
     System.out.println(c); 
     if (s.length() > 1) { 
      display(s.substring(1)); 

     } 
    } 

    public static void main(String[] args) { 
     MyClass mC = new MyClass(); 
     mC.display("SampleString"); 
    } 

} 

當我執行以下代碼時,如何遞歸調用顯示時能夠修改最終變量c的值? Isnt最終應該限制用戶這樣做如何在遞歸調用方法時修改Java中的最終變量

+0

你沒有修改任何變量。 – SLaks 2014-12-04 03:51:24

+0

當您調用顯示方法 – Secondo 2014-12-04 03:55:41

+0

時,您剛創建變量的新實例因此,即使我每次在變量c發生新的初始化時遞歸調用顯示, – 2014-12-04 03:56:41

回答

2

變量c的範圍在其封閉的方法中。這就是爲什麼當你遞歸地調用它時,每次它是不同的變量c。

3

您不修改變量,每次調用此方法都會獲取變量的新實例。如果您只需要一個實例,則可以將該聲明移動到類體中並聲明爲「靜態」。

0

您並未修改final變量,您正在創建一個新的堆棧幀,併爲您的方法display創建一個新變量c。此外,您的方法每次從String獲取一個char,並且您會得到一個新的String。所以,

public void display(final String s) { // <-- you *could* make `s` final 
    if (s == null || s.length() < 1) return; 
    final char c = s.charAt(0); 
    System.out.print(c); // <-- why put each char on a new line? 
    if (s.length() > 1) { 
     display(s.substring(1)); // <-- recurse. 
    } else { 
     System.out.println(); // <-- last char. new line. 
    } 
}