2013-04-07 73 views
4

我是编程方面的新手,以及本网站,所以请原谅我,如果我搞砸了。我有一段时间搞清楚如何在这里正确发布我的代码。什么时候'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此页面确实清除它。抱歉发布重复的问题。问题是我不知道我想问什么。我从来没有听说过这些术语“传值/参考”,所以现在我知道

+1

对这个问题的更好的答案之一,已经被这么多的形式已经问过:http://stackoverflow.com/a/9404727/680925 – Perception 2013-04-07 17:59:38

+0

可能重复[是Java“传递参考”? ](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – delnan 2013-04-07 18:04:57

回答

9

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

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

那项任务做参数的不变化值。 a的值仍然是相同的参考,对相同的数组 - 它只是更改数组的内容

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

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

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

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

+0

为伟大的想象+1:D – Maroun 2013-04-07 17:59:01

+1

你们刚刚吹嘘我的想法。这很有道理,谢谢!希望有一天我能像你们一样为本网站提供答案。现在我甚至不能'投票'哈哈。 – Ryan 2013-04-07 18:08:53

+1

@RyanKlassy:每个人都必须从某个地方开始,了解这是Java中最重要的早期步骤之一。突然之间*所有的东西*可能会更有意义 - 这意味着将一个变量的值赋给另一个变量,垃圾回收等等。 – 2013-04-07 18:13:53

1

Java使用按值传递(您要搜索的内容)。基本上这意味着它会将参数的副本传递给方法。这意味着你不能通过使用=操作符来改变指向的东西。

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

但是,在Object或数组的情况下,它不会生成Object或数组的副本,它会复制对Object或数组的引用。这意味着你有两个变量,原始的和在你的例子中的(int[] a),它们都指向内存中的同一个点。对任一变量的更改都会影响其他变量。

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

相关问题