Java 中的引用傳遞與值傳遞
Java 是一種按值傳遞語言,這意味著當參數傳遞給方法時,建立原始變數的副本。這可確保資料完整性並防止意外修改。但是,在某些情況下,可能需要修改原始變數而不是副本。
Java 中的按引用傳遞等效項
在 C 中,按引用傳遞允許變數透過其記憶體位址傳遞,從而可以修改原始值。雖然Java 缺乏明確的引用傳遞機制,但有幾種技巧可以達到類似的效果:
1.類別成員變數:
如果變數是類別成員,則可以將類別的實例傳遞給方法。方法內對成員變數所做的修改將反映在原始物件中。
2.傳回修改後的值:
您可以修改值並從方法傳回它,而不是透過參考傳遞。然後,呼叫者可以將修改後的值指派回原始變數。
3.類別或靜態變數:
如果變數被宣告為類別或靜態變量,則可以全域存取和修改它,包括在方法內。
4.陣列技巧:
您可以建立一個單元素陣列並將其作為參數傳遞。在方法中對數組元素的修改將有效地修改原始變數的值。
範例:
考慮以下Java 程式碼片段,我們希望在其中修改傳遞給play() 方法的toyNumber 變數:
public class XYZ { public static void main(String[] args) { int toyNumber = 5; XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main: " + toyNumber); } void play(int toyNumber) { System.out.println("Toy number in play: " + toyNumber); toyNumber++; System.out.println("Toy number in play after increment: " + toyNumber); } }
透過使用上述技術之一,我們可以實現所需的輸出,其中main() 中的原始toyNumber 變數被修改:
選擇1(類別成員變數):
class Toy { int toyNumber; } public class XYZ { public static void main(String[] args) { Toy toy = new Toy(); toy.toyNumber = 5; XYZ temp = new XYZ(); temp.play(toy); System.out.println("Toy number in main: " + toy.toyNumber); } void play(Toy toy) { System.out.println("Toy number in play: " + toy.toyNumber); toy.toyNumber++; System.out.println("Toy number in play after increment: " + toy.toyNumber); } }
選擇2(傳回修改後的值):
public class XYZ { public static void main(String[] args) { int toyNumber = 5; XYZ temp = new XYZ(); toyNumber = temp.play(toyNumber); System.out.println("Toy number in main: " + toyNumber); } int play(int toyNumber) { System.out.println("Toy number in play: " + toyNumber); toyNumber++; System.out.println("Toy number in play after increment: " + toyNumber); return toyNumber; } }
選擇3(類別或靜態變數):
class XYZ { static int toyNumber = 5; public static void main(String[] args) { XYZ temp = new XYZ(); temp.play(); System.out.println("Toy number in main: " + toyNumber); } void play() { System.out.println("Toy number in play: " + toyNumber); toyNumber++; System.out.println("Toy number in play after increment: " + toyNumber); } }
選擇4(陣列Trick):
public class XYZ { public static void main(String[] args) { int[] toyNumber = {5}; XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main: " + toyNumber[0]); } void play(int[] toyNumber) { System.out.println("Toy number in play: " + toyNumber[0]); toyNumber[0]++; System.out.println("Toy number in play after increment: " + toyNumber[0]); } }
結論:
雖然Java 是一種以值傳遞語言,但是可以採用多種技術來實現類似引用傳遞的行為。技術的選擇取決於具體的場景和要求。
以上是儘管 Java 具有按值傳遞的性質,但如何實現按引用傳遞行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!