2010-03-24 116 views
5

在C++中,如果需要修改2個對象,則可以通過引用傳遞。你如何在java中完成這項工作?假設2個對象是基本類型,例如int。在Java中通過引用傳遞?

+0

這是http://stackoverflow.com/questions/589919/doe S-java的傳遞通過引用 – Zxaos 2010-03-24 00:20:06

回答

12

你不行。 Java不支持傳遞對變量的引用。一切都通過價值傳遞。

當然,當按值傳遞對象的引用時,它將指向同一對象,但這不是通過引用調用。

0

使用泛型,你可以創建一個指針類,這將至少有點痛苦。你傳遞對象,改變它的value屬性,當函數退出時,你的對象將包含新的值。

MyPointerClass<int> PointerClass = new MyPointerClass<int>(5); 
myFunction(PointerClass); 
System.out.println(PointerClass.Value.toString()); 

// ... 

void myFunction(myPointerClass<int> SomeValue) 
{ 
    SomeValue.Value = 10; 
} 
1

Java沒有引用傳遞,但您仍然可以從這些引用(它們本身通過值傳遞)中對象進行變異。

正如你可以看到,你仍然可以修改對象(如果它們不是不可變的);你不能通過將引用或基元傳遞給一個函數來修改它。

當然,你可以使它們成爲一個對象的域,並通過那些對象,並將它們設置爲任何你想要的。但是,這仍然沒有通過參考。

2

將它們包裝在一個對象中,然後將該對象作爲參數傳遞給該方法。

例如,以下C++代碼:

bool divmod(double a, double b, double & dividend, double & remainder) { 
    if(b == 0) return false; 
    dividend = a/b; 
    remainder = a % b; 
    return true; 
} 

可以在Java被重寫爲:

class DivRem { 
    double dividend; 
    double remainder; 
} 

boolean divmod(double a, double b, DivRem c) { 
    if(b == 0) return false; 
    c.dividend = a/b; 
    c.remainder = a % b; 
    return true; 
} 

雖然在Java中更慣用的風格是創建並從該方法返回該對象而不是接受它作爲參數:

class DivRem { 
    double dividend; 
    double remainder; 
} 

DivRem divmod(double a, double b) { 
    if(b == 0) throw new ArithmeticException("Divide by zero"); 
    DivRem c = new DivRem(); 
    c.dividend = a/b; 
    c.remainder = a % b; 
    return c; 
}