2011-09-17 40 views
1

我在瓦爾特·薩維奇書「的Java簡介」的例子看例子方式的Java類的類型參數處理

// This method does not do what we want it to do. 
public static void openFile(String fileName, 
    PrintWriter stream) throws FileNotFoundException 
{ 
    stream = new PrintWriter(fileName); 
} 

PrintWriter toFile = null; 
try 
{ 
    openFile("data.txt", toFile); 
} 

筆者給出的解釋,這沒有任何意義,至於爲什麼toFile = nulltry

謝謝!

+1

你能展示更多代碼嗎?沒有_catch_或_finally_的情況下,您不能擁有_try_。 –

+0

作者的解釋是什麼? –

回答

2

你需要更深入地讀這本書的那一段:

openFile()將需要返回新PrintWriter:作爲

public static PrintWriter openFile(String fileName) throws FileNotFoundException 
{ 
    PrintWriter stream = new PrintWriter(fileName); 
    return stream; 
} 

和調用。 (我確定它確實有意義......但你還沒有明白它。)

很明顯,作者實際上是試圖說明Java的一個非常重要的方面......參數被傳遞。

具體而言,他是想說明,這兩個stream標識是不同變量,並且該分配方法中

stream = new PrintWriter(fileName); 

不會影響只是try之前聲明的變量stream。分配給方法內的stream變量的值會丟失。

這說明Java使用「傳值」作爲其參數傳遞機制。 (如果您需要從方法調用中獲取值,那麼執行此操作的簡單方法是return。)

+0

嗨!謝謝你的迴應!我對C/C++更加了解,可能會錯過簡單的事實,即Java中的參數是「按值傳遞」而不是「按引用」傳遞的。感謝您指出。 – newprint

2

作者正試圖向您解釋,更改方法內引用的變量在方法外不可見。

toFile將在openFile()之後null因爲參考值傳遞給方法並分配給本地變量stream。除非您明確地將其返回,否則在該方法外部不能看到更改該方法內的stream的值。

PrintWriter toFile = null; 
try 
{ 
    toFile = openFile("data.txt"); 
} 
+0

感謝您澄清'返回' – newprint

-1

在Java實例和靜態字段中都有默認值。你可以寫PrintWriter toFile,而不用初始化爲null。但在使用它們之前,局部變量必須是initialized。並且如果作者想在catch塊中使用toFile變量,則如果未編譯器會給出範圍錯誤,則應將範圍toFile定義爲更高級別。

+0

爲什麼-1它的正確答案 – ozhan

+1

因爲這不是真正的例子。這不是OP實際要求的。他要求解釋*「爲什麼toFile = null **嘗試後**」* ...不是爲什麼您需要初始化變量。 –