2015-10-27 73 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); 
    } 

你甚至都不需要静态方法了