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

时间:2013-04-07 17:53:40

标签: java methods parameters 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'?**
    }

}

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

该分配更改参数的值。 a的值对于同一个数组仍然是相同的引用 - 它只是更改了数组的内容

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

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

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

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

答案 1 :(得分:1)

Java使用传递值(您要搜索的内容)来处理所有事情。从本质上讲,这意味着它会创建一个参数的副本,然后将其传递给该方法。这意味着你不能通过使用=运算符来改变某些东西。

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

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

按值传递,按引用传递,按值传递引用是您要搜索的内容类型以获取更多信息。