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

Rya*_*yan 5 java parameters methods return-value void

我是编程以及本网站的新手,所以如果我搞砸了,请原谅我.我有一点时间搞清楚如何在这里正确发布我的代码.

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

}
Run Code Online (Sandbox Code Playgroud)

所以我的问题基本上是作为评论键入的.当传递给另一个方法的int没有改变时,为什么传递给方法的数组会改变原始数组(x [])的值?我确信这是一个简单的答案,但是当我做研究时,我无法弄清楚要搜索什么.我不知道这叫什么,所以我搜索的一切都让我错了.谢谢你的帮助!!

编辑:谢谢与地址的类比!这是迄今为止您向我解释的最佳方式.所以基本上当你将一个数组传递给一个参数时,它传递一个引用,而不是实际值?因此,当我在我的方法中进行调整时,它会改变数组所引用的内容吗?我注意到这也发生在列表中.所以列表实际上并没有按值传递?似乎数组/列表本身基本上都是传入进行编辑的,无论我在我的方法中命名它(在这种情况下为a []).

编辑 http://javadude.com/articles/passbyvalue.htm 此页面确实清除了它.抱歉发布重复的问题.问题是我不知道我想问什么.我甚至从未听过这些术语"传值/参考",所以现在我知道了

Jon*_*eet 9

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

public static void editnumbersArray(int[] a){
    a[2] = 9;
}
Run Code Online (Sandbox Code Playgroud)

该赋值不会更改参数的值.对于a同一个数组,值仍然是相同的引用 - 它只是更改数组的内容.

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

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

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

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