传递给静态和非静态方法的参数差异

时间:2012-12-21 16:10:12

标签: java

静态方法处理参数的方式与非静态方法不同吗?假设我的项目中有以下类/方法:

public abstract class A {
   public static void populateList(List<Item> list) {
      list.add(new Item("something")); //Item is custom class
   }

public class B {
   public void tryToPopulateList(List<Item> list) {
      list.add(new Item("something2"));
   }

现在,如果我使用A.populateList(myList)将列表传递给A类,则方法体中指向list的指针与调用者中指向myList的指针相同,因此此静态方法实际更改{ {1}}而不仅仅是本地副本。
但是,如果我打电话:

myList

然后在方法中指向B b = new B(); b.tryToPopulateList(myList); 的指针与指向list的指针不同,所以我想该方法的本地副本已创建,并且“something2”被添加到此副本中。结果是在这种情况下原始的myList没有改变 这种行为是否正常?您是否有任何解释或链接到explenation如何在静态函数中传递参数?
是的,我知道如果我想更改列表,最好从函数返回新列表,但我只是很好,因为我没有在任何地方找到这个主题。谢谢。

修改
如注释中所述,参数在静态和非静态方法中的处理方式相同。我在这里没有列出的代码中犯了一个错误。

2 个答案:

答案 0 :(得分:2)

在正常情况下,应该没有区别。 Java中的所有方法参数都是按引用值传递的,这意味着列表的地址(指针)被复制到被调用方法的参数中。

我只能想到您描述的行为可能发生的一种情况:您使用的是提供面向方面编程功能的框架吗?您的非静态方法调用可能被截获。

答案 1 :(得分:0)

这是一个底线,Java中的所有方法参数都是按引用值。