2

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

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,A.populateList(myList)那么指向list方法主体的指针与指向myList调用者的指针相同,因此这个静态方法实际上会发生变化myList,而不仅仅是它的本地副本。
但是,如果我打电话:

B b = new B();
b.tryToPopulateList(myList);

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

编辑
正如评论中提到的,参数在静态和非静态方法中的处理方式相同。我在此处未列出的代码中犯了错误。

4

2 回答 2

2

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

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

于 2012-12-21T16:20:50.430 回答
0

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

于 2012-12-21T17:23:13.837 回答