【问题标题】:JAVA Assignment & OperatorsJAVA 赋值和运算符
【发布时间】:2015-03-19 20:24:48
【问题描述】:

下面的代码打印出 15 15,但我希望它打印出 12 15。似乎修复方法正在更新 a1,使其包含 3,7,5 而不是 3,4,5。有人知道为什么会这样吗?

class PassA 
{
    public static void main(String [] args) 
{
    PassA p = new PassA();
    p.start();
}

void start() 
{
    long [] a1 = {3,4,5};
    long [] a2 = fix(a1);
    System.out.print(a1[0] + a1[1] + a1[2] + " ");
    System.out.println(a2[0] + a2[1] + a2[2]);
}

long [] fix(long [] a3) 
{
    a3[1] = 7;
    return a3;
}
}

【问题讨论】:

  • 你会发生什么?最后 a2 和 a1 指向同一个数组,您已将其修改为以 7 作为中间元素。
  • 只要您没有在 fix 方法中执行数组的深拷贝,a1a2 都引用了值为 {3,4,5} 的数组。
  • fix() 获取对数组的引用作为参数。这意味着它会更改原始数组的值。 fix() 更改第二个单元格的值(请记住,数组索引从 0 开始)使其成为 {3,7,5}

标签: java arrays oop operators assignment-operator


【解决方案1】:

您通过引用传递数组,这就是为什么在 fix() 方法中,原始数组被修改。您可以使用

将副本传递给方法
long [] a2 = fix( Arrays.copyOf(a1, a1.length));.

好的,从技术上讲,您是按值传递数组,但值引用。

【讨论】:

  • 你可能想检查这个线程,因为 java 总是按值传递;)stackoverflow.com/questions/40480/…
  • 因为在 Java 中数组是对象,所以当按值传递时,你会传递引用。
  • 好的,如果不传递数组,而是传递一个固定值,即字符串或整数,这会有什么不同?
  • Java 中的一切都是按值传递的,这意味着参数在进入方法时会复制。当传递原语(byte、short、int、long、float、double、boolean、char)时,它们只是被复制,你在方法中有一个新的原语,它的值与作为参数传递的值相同。当传递 anything else 时,您传递的是一个对象引用,该引用又在进入方法时被复制。但是您仍在对原始对象进行操作。这也是原始数组被修改的原因。
【解决方案2】:

这将实现您的目标 12 15

long [] fix(long [] a3) 
{
    return new long[]{a3[0], 7, a3[2]};
}

因为否则,您传递 a1(命名为 a3),修改一个元素,随后在 a1 中更改它。所以现在 a1 被改变了。稍后您返回 a1 并将其设置为 a2.. 所以 a2 和 a1 指向同一个数组 {3,7,5}

【讨论】:

    【解决方案3】:

    看看下面

     long[] fix(long[] a3) { // a3=a1 and a1= {3,4,5}
        a3[1] = 7; // a3[1]=7 means a1[1] will become 7(a1[1]=7), now a1={3,7,5}
        return a3;// return a1
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2015-05-02
      • 2013-02-14
      • 2014-04-17
      • 2018-11-30
      • 1970-01-01
      • 2014-08-25
      • 2013-06-28
      相关资源
      最近更新 更多