【问题标题】:Pass by Ref Java. Integer ins't modified, Collection is modified, Why? [duplicate]通过参考 Java。整数 ins 没有被修改,Collection 被修改,为什么? [复制]
【发布时间】:2013-02-13 03:33:48
【问题描述】:

我有两个不明白的例子

Java 将值作为变量传递或通过引用传递

为什么在Ref 类中整数变量没有改变(null)? 为什么RefCol类中的集合变量被修改col(1)

类参考:

test(): entero: 5

inicio(): entero: null

类 RefCol:

test(): col: [1]

inicio(): col: [1] 

.

import java.util.Collection;
import java.util.Vector;


public class Ref {

    public static void main(String[] args){
        Ref ref = new Ref();
        ref.inicio();
    }

    public void inicio(){
        Integer entero = null;
        test(entero);
        System.out.println("inicio(): entero: " + entero);
    }

    public void test(Integer entero){
        entero = new Integer(5);
        System.out.println("test(): entero: " + entero);
    }

}





public class RefCol {

    public static void main(String[] args){
        RefCol ref = new RefCol();
        ref.inicio();
    }

    public void inicio(){
        Collection col = new Vector();
        test(col);
        System.out.println("inicio(): col: " + col);
    }

    public void test(Collection col){
        col.add( new Integer(1) );
        System.out.println("test(): col: " + col);
    }

}

【问题讨论】:

标签: java collections integer pass-by-reference


【解决方案1】:

您正在将 REFERENCE 的副本传递给对象实例。

如果直接更改对象。例如col.add 会改变底层对象。

如果您更改它所引用的对象。例如。 new Integer() 只会改变局部变量的引用。

【讨论】:

    【解决方案2】:

    不是一回事。

    entero = new Integer(5);
    

    更改引用entero,同时

    col.add(new Integer(1));
    

    更改引用的对象col

    【讨论】:

      【解决方案3】:

      简而言之:原始类型和“原始包装器(Integer、Long、Short、Double、Float、Character、Byte、Boolean)”不能通过引用进行更改。

      查看http://en.wikipedia.org/wiki/Immutable_object了解详情

      【讨论】:

      • 这是我最喜欢的答案:D 是我需要知道的。谢谢!!
      • 原始类型和“原始包装器”...通常所有类都是最终的吗?我正在尝试使用 StringBuffer(是最终的)而不是改变。
      • 这只是故事的一半。因为这些对象是不可变的,所以您正在创建一个新实例,而不是在它们上调用方法,因此重新分配变量正在引用的 objexct。如果你做了 col = new ArrayList() 你会看到同样的行为
      • 实际上这不是一个有效的答案。他并没有尝试在代码中的任何地方更改不可变对象。
      • 可变性与这个问题无关。分配任何类型的引用永远不会影响所引用的对象,无论是哪种对象。 “变异”引用指向的对象的唯一方法是调用对象上的方法,就像他对add 所做的那样。他没有对Integer 这样做(好吧,碰巧Integer 上没有任何方法可以改变它;但这不是重点),所以这就是为什么它不一样。
      【解决方案4】:

      { 这里创建的对象会在大括号(})结束后销毁

      }

      【讨论】:

      • 不,col.add(new Integer(1));
      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2016-06-30
      • 1970-01-01
      • 2015-05-14
      • 2011-09-14
      • 2019-12-12
      相关资源
      最近更新 更多