Possible Duplicate:
Is Java pass-by-reference?
Java pass by reference




对于以下Java程序,我的理解是a是Integer的引用类型,就像C / C ++中的指针类型一样。因此,方法f中对其值所做的任何更改都将在方法返回后反映出来。但是println仍会打印其原始值0而不是3。

Integerint没有区别。我以前的理解错了吗?请帮忙。谢谢!

  public static void f(Integer b){
            b=3;
        }
        public static void main(String[] args){
            Integer a=0;
            f(a);
            System.out.println(a);
      }

最佳答案

Integer(像其他“基本”类一样)是不可变的对象。这意味着没有方法可以更改该值。如果你这样做

 new Integer(1);


创建的对象将始终保留1值。

当然可以

Integer a = new Integer(1);
a = new Integer(2);


但是在这里,您要做的是创建两个对象,并依次为每个对象分配一个。

调用该方法时,您将在a中传递引用的副本(如edalorzo所说),因此您所做的几乎相同(但无需更改原始的a引用)。

当然,许多类不是不变的。在这些类中,您将拥有一个(或几个)方法来更改对象的内部状态,并且(只要您访问同一对象)这些更改将被对象的所有引用“共享”(因为它们都指向同一个)。例如,假设Integer具有setValue(int)方法,则

public static void f(Integer b){
        b.setValue(3);
    }
    public static void main(String[] args){
        Integer a=0;
        f(a);
        System.out.println(a);
  }


会按预期工作。

10-04 14:35
查看更多