'void'方法何时影响参数,何时影响原始对象?



我是一个编程新手,也是这个网站的新手,所以如果我搞砸了,请原谅我。我有一个heck的时间弄清楚如何正确地张贴我的代码在这里。

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'?**
    }
}

我的问题基本上是作为注释输入的。为什么传递给方法的数组改变了原始数组(x[])的值,而传递给其他方法的int值没有改变?我相信这是一个简单的答案,但是当我做我的研究时,我不知道该搜索什么。我不知道这叫什么,所以我搜索的所有东西都指向错误的方向。谢谢你的帮助!!

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

EDIT http://javadude.com/articles/passbyvalue.htm这个页面真的澄清了。很抱歉发了一个重复的问题。问题是我不知道我想问什么。我从来没有听说过"按值传递/引用"这些术语,所以现在我知道

在Java中,改变形参本身的值不会影响实参,因为所有实参都是按值传递的。但是,看看这个方法:

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

赋值不会改变形参的值。a的值仍然是相同的引用,指向相同的数组-它只是改变了数组的内容

想象一下,如果我把我的家庭住址写在一张纸上给你。不管你对那张纸做了什么——那也不会改变我住的地方。然而,如果你访问这个地址,把前门漆成绿色,而不改变这张纸,我看到这个变化。

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

  • 变量是一个命名的存储位置;它保存一个值,总是要么是原始值(例如int),要么是引用。在上面的例子中,这张纸就像一个变量。
  • 引用只是一个值,它允许你导航到一个对象。它不是物体本身。就像纸上的地址。
  • 对象包含其他变量。可能有几个变量,它们的值都是对同一个对象的引用。这就像我举的例子中的房子:我可以把我的地址写在几张纸上,但只有一个房子。

数组是作为其他变量的容器的对象。因此,a的值只是对数组的引用。

Java对所有内容使用按值传递(您想要搜索的内容)。本质上,这意味着它会复制参数,然后将其传递给方法。这意味着不能通过使用=操作符来改变某项所指向的内容。

这就是为什么(int a)版本没有改变a。

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

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

最新更新