2015-10-27 74 views
0

是我的代碼的Java通過引用傳遞INT

public class Scale { 

    public static void main(String[] args) { 

     int x = 4; 
     int y = 3; 
     int faktor = 2; 

     skaliere(x,y,faktor); 

     System.out.println(x + " " + y); 
    } 

    public static void skaliere(int x, int y, int faktor){ 

     // ? 

    } 
} 

我想FAKTOR改變比例x和y,不使用返回值。只是通過skaliere方法。

回答

4

我想改變規模的x和y由faktor,而不是使用返回值。只是通過skaliere方法。

注意,Java是不是通過引用傳遞,它由值總是通。

沒有任何黑客,只是你不能,因爲他們是原始人。如果他們是可變對象,是的,你可以改變他們的狀態。

這種攻擊會使它們變爲靜態並在該方法內分配值。

+0

注意,黑客也將使它不可能遞歸或multithreadedly調用該方法。 –

-1

你可以用包裝這兩個值的對象來做到這一點。這是因爲對象引用被傳遞給方法。如果你傳遞一個不可變的基元,它們將不會在返回時被改變,它只會改變方法中的一個副本。使用一個對象,您可以傳遞包含的值,並且它將被檢索時由主方法引用的值。

public static void main(String[] args) { 

    // org.eclipse.swt.graphics.Point 
    Point p = new Point(0, 0); 
    p.x = 4; 
    p.y = 3; 
    int faktor = 2; 
    skaliere(p,faktor); 

    System.out.println(p.x + " " + p.y); 
} 

public static void skaliere(Point p, int factor){ 
    p.x *= factor; 
    p.y *= factor; 
} 
-1

你總是可以讓你自己MutableInteger

class MutableInteger{ 
     private int value; 

     public MutableInteger(int v){ 
      this.value = v; 
     } 

     public int get(){ 
      return value; 
     } 

     public void set(int newValue){ 
      this.value = newValue; 
     } 

     @Override 
     public String toString() { 
      return Integer.toString(value); 
     } 


    } 

然後用它在你的代碼:

public static void main(String[] args) { 

    MutableInteger x = new MutableInteger(4); 
    MutableInteger y = new MutableInteger(3); 
     int faktor = 2; 

     skaliere(x,y,faktor); 

     System.out.println(x + " " + y); 
    } 

    public static void skaliere(MutableInteger x, MutableInteger y, int faktor){ 

     x.set(x.get() *faktor); 
     y.set(x.get() *faktor); 
    } 

既然你做你自己的類,你甚至可以移動skaliere方法進入你的MutableInteger

class MutableInteger{ 
    ... 
     public void skaliere(int faktor){ 
      this.value *=faktor; 
     } 
    } 

,讓您的代碼如下所示:

public static void skaliere(MutableInteger x, MutableInteger y, int faktor){ 

     x.skaliere(faktor); 
     y.skaliere(faktor); 
    } 

你甚至都不需要靜態方法了