【问题标题】:When does a 'void' method affect the parameter, and when does it affect the original object?'void' 方法何时影响参数,何时影响原始对象?
【发布时间】:2013-03-29 17:55:23
【问题描述】:

我对编程和这个网站都是全新的,如果我搞砸了,请原谅我。我花了很长时间弄清楚如何在此处正确发布我的代码。

package tester;
import java.util.*;
public class Mainclass2 {
    public static void main(String[] args) {

        int y = 3; 
        int[] x = {1, 2, 3, 4};

        editnumbersArray(x);
        editnumbersNotArray(y);

        System.out.println(x[2]); **//now this was changed from 3 to 9...**
        System.out.println(y);    //but this one went unchanged.

    }

    //this accepts 'x[]' into the 'a[]' parameter.
    public static void editnumbersArray(int[] a){
        a[2] = 9;  **//<---why does this one CHANGE the actual x[2] instead of just a[2]?**
    }

    //this accepts 'y' into the 'a' parameter.
    public static void editnumbersNotArray(int a){
        a = 9;  **//<--while this one only changes 'a' instead of 'y'?**
    }

}

所以我的问题基本上是作为 cmets 输入的。为什么传入方法的数组会改变原始数组(x[])的值,而传入另一个方法的 int 没有改变?我确定这是一个简单的答案,但是当我进行研究时,我无法弄清楚要搜索什么。我不知道这叫什么,所以我搜索的所有内容都让我走错了路。感谢您的帮助!

编辑:感谢与地址的类比!这是迄今为止你可以向我解释的最好方式。所以基本上当你将一个数组传递给一个参数时,它传递一个引用,而不是实际值?所以当我在我的方法中进行调整时,它会改变数组引用的任何内容? 我注意到这也发生在列表中。那么列表实际上不是按值传递的吗?似乎数组/列表本身基本上是为了编辑而传入的,无论我在我的方法中命名它是什么(在本例中为 a[]。)

编辑 http://javadude.com/articles/passbyvalue.htm这个页面真的很清楚。很抱歉发布重复的问题。问题是我不知道我想问什么。我什至从未听说过“按值传递/引用”这些术语,所以现在我知道了

【问题讨论】:

标签: java methods parameters return-value void


【解决方案1】:

更改参数本身的值不会影响 Java 中的参数,因为所有参数都是按值传递的。不过,看看这个方法:

public static void editnumbersArray(int[] a){
    a[2] = 9;
}

那个赋值不会改变参数的值。 a 的值仍然是同一个引用,指向同一个数组——它只是改变了数组的内容

想象一下,如果我在一张纸上为你写下我的家庭住址。你对那张纸做了什么并不重要——那不会改变我住的地方。但是,如果您访问该地址并将前门漆成绿色,而根本不改变那张纸,我看到这种变化。

区分不同的概念非常重要:

  • 变量是一个命名的存储位置;它拥有一个值,总是是原始值(例如int)或引用。在我上面的例子中,这张纸就像变量一样。
  • reference 只是一个允许您导航到对象的值。这不是对象本身。就像纸上的地址。
  • 对象包含其他变量。可能有几个变量都具有引用同一对象的值。就像我的示例中的房子:我可以在几张纸上写下我的地址,但只有一所房子。

数组是一个对象,它充当其他变量的容器。所以a的值只是对数组的引用。

【讨论】:

  • 你们让我大吃一惊。太有道理了,谢谢!希望有一天我能像你们一样为这个网站提供答案。现在我什至不能“投票”哈哈。
  • @RyanKlassy:每个人都必须从某个地方开始,理解这是 Java 中最重要的早期步骤之一。突然间,everything 可能更有意义了 - 将一个变量的值分配给另一个变量的意义,垃圾回收等。
【解决方案2】:

Java 对所有内容都使用按值传递(您要搜索的内容)。本质上,这意味着它会复制参数,然后将其传递给方法。这意味着您无法通过使用 = 运算符来更改某些内容。

这就是为什么(int a) 版本不会改变的原因。

但是,对于对象或数组,它不会复制对象或数组,而是复制对对象或数组的引用。这意味着您有两个变量,原始的 on 和在您的示例中的 (int[] a) 一个,它们都指向内存中的同一个位置。对任一变量的更改都会影响另一个变量。

按值传递、按引用传递和按值传递引用是您要搜索更多信息的事物类型。

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 2015-01-23
    • 1970-01-01
    • 2021-01-08
    • 2019-09-10
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多