2013-05-15 29 views
0

我一直理解Java按值傳遞參數。我有一些我似乎無法調試的代碼。這裏有一個簡化版本:Java:方法似乎通過引用傳遞

private isFinished = false; 
private int target, count; 

public Example(int target){ 
    this.target = target; 
} 
public void doProcess(int x){ 
    count += x; 
} 
public boolean isFinished(){ 
    if(x < target){ 
     return false; 
    } else { 
     return true; 
    } 
} 


private Example example; 

public Test(Example e){ 
    this.example = e; 
} 
public isFinished(){ 
    return e.isFinished(); 
} 
public void doProcess(){ 
    e.doProcess(3); 
} 


private Example example; 
public Generate(Example e){ 
    this.example = e; 
} 
public void generate(int num){ 
    for(int y=0; y < num; y++){ 
     Test t = new Test(example); 
     while(t.isFinished == false){ 
      t.doProcess(); 
     } 
    } 
} 

Generate類以一個Example作爲參數。它使用此示例並將其傳遞給「測試」。發生什麼事情是,當調用Generate.generate()時,第一次迭代可以正常工作,但是在每次迭代時,應該將新的Test作爲參數傳遞給該示例。當我調用doProcess()的時候,'示例'似乎正在被改變,當我想要的是每次使用創建時傳遞給Generate的同一個示例創建一個新的Test。

+0

閱讀http://stackoverflow.com/questions/40480/is-java-pass-by-reference – Craig

+1

只有一個'Example',那麼這是唯一可以使用的'Example'。你在哪裏創建一個新的'Example'?你正在修改單個實例的內部。 –

回答

4

Java那樣傳值,但在基準參數的情況下,它傳遞的對象不是值的參考價​​值。這有副作用,那些引用指向的實例可以在方法內部更改,並且方法返回後可以看到更改。

+0

那麼,什麼是修復?我不想讓它修改它。 – user2341412

+1

@ user2341412不想修改什麼?如果你想在'generate'內部的循環的每一次迭代都需要一個'Example'的新實例,你將不得不創建一個新的實例來傳入'Test'構造函數。 –

0

Java總是按值傳遞參數。

正如其他人提及的,被傳遞爲引用類型的「值」是一個指針。這個指針指向指定對象的內存位置。將參考類型作爲參數傳遞時,不能更改在調用代碼中傳遞的指針,但可以在被調用的代碼中更改指定參考類型的成員。沒有辦法繞過它。

一種解決方案是讓你的對象的防守副本,然後通過其引用到你的方法。

另一種解決方案是設計避免了在引用類型的副作用盡可能除非這些變化是被調用代碼正在履行呼叫者合同的一部分的代碼。