【问题标题】:Pass by value vs pass by reference in java [duplicate]java中按值传递与按引用传递[重复]
【发布时间】:2014-09-10 08:13:51
【问题描述】:

好的,如果java中的原始数据类型被传递给方法,它们被视为按值传递。如果将对象数据类型传递给方法,它们会被视为按引用传递,对吗?所以在这段代码中:

//Class 1
public void passByValue(int x){
    x = 0;
}

public void passByReference(Integer y){
    y= 40;
}

//MainClass(contains main method)

    int primitiveType = 50;
    Integer wholeInteger = 100;
    Class1 a = new Class1();

    a.passByValue(primitiveType);
    a.passByReference(wholeInteger);

    System.out.println(primitiveType);
    System.out.println(wholeInteger);

这应该导致primitiveType等于50(变量没有改变)。我明白,但是 Integer 对象也没有改变......那么这是如何工作的?谢谢!

【问题讨论】:

  • 这个问题已经被问过很多次了...... Java 是“按值传递”,对对象的引用也是按值传递的——所以你不要更改发送的引用!
  • 好的,那么 Collections.sort() 呢?您不必这样做:“listName = Collections.sort(listName);”相反,您可以这样做:“Collections.sort(listName);”并且 listName 将被排序(即更改)。所以它是 PASS BY REFERENCE。
  • 没有。 listName 是一个参考。引用是按值传递的。
  • 那么为什么我的代码示例没有成功..?我的意思是 Collections.sort() 和我的方法有什么区别?您刚刚承认引用是按值传递的……那这意味着什么?

标签: java pass-by-reference pass-by-value


【解决方案1】:

Object references 也是按值传递的。传递的是引用而不是对象。您将对象的按引用传递与引用的按值传递混淆了。

A x = new A() 中,符号x对A 类型对象的引用

如果x 是一个引用并且f(A a) { a = null; } 是一个方法,那么f(x) 不会将x 设置为null。 因此,引用是按值传递的。

这背后的原因(以及你的困惑)是 - 在某种程度上 - “对象被传递...”这句话已经是错误的。因为我们必须正确地说“对象引用是通过...传递的”。如果A 是一个类,那么A a; 意味着a 是对class A 对象的引用。如果这很清楚,那么为什么我们有一个按值传递的原因就很清楚了。

【讨论】:

  • 哦,既然每个人都将这个问题标记为重复,我为什么在阅读其他所谓的重复之后再次询问它的原因,我不明白关于“将对象指针传递为价值”这就是为什么我再次问它,以获得更清晰的回应。
  • 这样说真的没有意义,为什么不让java对象通过引用传递呢?我的意思是什么白痴让它变得如此复杂?
  • 我相信其根源在于 Java 中只有对对象的引用(因此 Java 中的 A a 是 C++ 中的 A* a )。如果您考虑一个字段(成员),这很清楚。该字段是对对象的引用。鉴于我们可以按值或按引用传递该引用。通过引用传递它就是传递对引用的引用(这更复杂)。
【解决方案2】:

首先,当你传递一个对象时,java中没有通过引用传递,那么它也是按值传递......

其次,和 String 类一样,封装类 Integer 也是不可变的……

当你写 Integer y= 40 ;然后新对象新整数(40);正在通过自动装箱功能创建 java 支持..

这就是为什么 .... 你传递的 WholeInteger 的值没有变化..

【讨论】:

  • 那么 Collections.sort() 和我的方法有什么区别?你能解释一下吗?
猜你喜欢
  • 2013-12-02
  • 2012-03-12
  • 2013-09-15
  • 2012-03-13
  • 1970-01-01
  • 2011-05-16
  • 2019-05-07
  • 2023-03-07
相关资源
最近更新 更多