2012-12-21 67 views
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在这种情况下不会被改变。
这种行为是否正常?你有任何解释或链接到explenation传递参数如何在静态函数中工作?
是的,我知道如果我想更改列表,我会更好地从函数中返回新的列表,但我只是很好奇,因为我没有在任何地方找到这个主题。谢谢。

编辑
正如评论所说,参数将被视为相同的方式在静态和非静态方法。我在这里没有列出的代码中犯了一个错误。

+2

您确定在第二种情况下没有修改原始副本。我认为,应该修改。请重新检查一下。 –

+1

“静态”与实例方法中的参数处理没有区别。 – madth3

+0

那么,至少不是在我的项目。我将在普通的Java应用程序中重新测试它,但在调试时,我可以清楚地看到方法体中的对象“list”与被调用者传递的“myList”具有不同的地址。另外返回者列表是未修改的(具有零项...不为空)。 Item类的定义可以改变什么?它只是String和bool持有者。 – Tom

回答

0

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

2

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

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

+0

那么,如果它有任何区别,那么这是Android项目,并且此项目中只有外部库是GSON。 – Tom