2013-10-04 186 views
3

我使用3个对象--StringBuilder,Integer和testobject - 传递给方法来更改其状态。 正如预期的那样,StringBuilder和testobject指向同一个对象,并且状态是变化的,但它不适用于Integer对象。将对象传递给方法java

class testobject{ 
    int x = 1; 
} 

public class test{ 
    public static void main(String[] args){ 
     StringBuilder s1 = new StringBuilder("String"); 
     go(s1); 
     System.out.println(s1); 

     Integer s2 = new Integer("20"); 
     go1(s2); 
     System.out.println(s2); 

     testobject s3 = new testobject(); 
     go2(s3); 
     System.out.println(s3.x); 
    } 

    static void go(StringBuilder s1){ 
     s1.append("Builder"); 
    } 

    static void go1(Integer s2){ 
     s2 = 1; 
    } 
    static void go2(testobject s3){ 
     s3.x = 5; 
    } 



    Result: 
    StringBuilder 
    20 
    5 

    ExpectedResult: 
    StringBuilder 
    1 
    5 
+1

'Integer'对象是不可变的。通过尝试将其分配给新号码,您正在创建一个新对象。 – jonhopkins

+3

在Java中没有任何内容被引用传递。 (在对象的情况下,它们是引用类型,按值传递。) – Sneftel

回答

5

看看你的三种方法:

static void go(StringBuilder s1){ 
    s1.append("Builder"); 
} 

static void go1(Integer s2){ 
    s2 = 1; 
} 

static void go2(testobject s3){ 
    s3.x = 5; 
} 

gogo2,你作出的修改对象的参数值是指。

go1中,您正在更改参数变量本身的值。这是非常不同的,并且因为Java always uses pass-by-value,调用者看不到这种变化。

重要的是要明白,对象根本没有传递给方法。相反,引用是。 s1,s2s3的值都是参考。如果您将变量看作像纸片一样,每张纸上都有一个房子地址,它是从main中声明的一张纸上复制而来的。

方法体gogo2就像访问地址在纸上的房子,并绘制前门。如果您使用原件纸片访问房屋,您仍会在前门看到新的颜色。

go1的方法体就像是写出写在纸上的地址,然后写一个新的地址。这不会改变房子,也不会改变原来的纸张。

+0

@ Jon - 我不需要记住这一点..我很好地解释了 – user1050619

+2

@ user1050619:我不确定你的意思。你绝对*需要记住这一点......这是Java的一个基本部分。 –

+0

如果我们像'Integer s2 = new Integer(20)'一样初始化对象,它会有所作为,因为我可以看到它有两个构造函数,一个接受'String',另一个接受'int',如下所示: http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html – user2339071

-1

传递对象在方法如果u要传递的参数为对象,而不是原始那么Java对待路过对象作为由value.becoz通你知道Java支持通过噪声值概念。

这里& p与上相同的附图

public class ObjPass { 
    int value; 
    public static void main(String[] args) { 
     ObjPass p = new ObjPass(); 
     p.value = 5; 
     System.out.println("Before calling: " + p.value); 
     increment(p); 
     System.out.println("After calling: " + p.value);  
    } 
public static void increment(ObjPass a){ 
     a.value++; 

    } 

} 

o/p: 
       Before calling: 5 
          After calling: 6