Android - 按引用共享对象

时间:2011-02-19 12:20:36

标签: java android pass-by-reference

嘿,人们, 我创建了一个扩展应用程序以共享某些变量的类。在每个活动中,我然后使用该类的对象(globalstate):

gs = (GlobalState) getApplication();

然后我声明了引用共享变量的局部变量,例如:

boolean localStr = gs.str;

现在我认为这将传递一个引用,因此对localStr的任何更改都将反映在globalstate中的str中。然而,情况似乎并非如此。

在这个庄园中创建的一些变量(例如对象数组)似乎作为参考传递,因此任何更改都反映在globalstate中,但是对于几乎所有其他变量(布尔值,字符串和输出),似乎更改不是反映,因此被复制而不是被引用。

我做错了什么或这是android如何工作,如果是这样我怎么能通过引用传递?感谢。

2 个答案:

答案 0 :(得分:2)

boolean是一个值类型,Java不使用引用来存储它。对于所有Java原始类型(int,long,...)都是一样的。字符串是不同的,它们是引用类型,但是如JohanSjöberg所解释的那样是不可变的。

这就是为什么当使用ArrayList(例如)时,如果尝试使用类似new ArrayList<boolean>()的值类型,则会出现错误。但是new ArrayList<Boolean>()将起作用,因为布尔值是引用类型,而不是值类型。

为了避免您的问题,您应该在任何地方使用您的引用(使用gs.str而不是创建局部变量localStr)。如果你真的不明白我在说什么,我可以更好地解释一下。

答案 1 :(得分:1)

这不仅仅是android的工作方式,而是java的工作方式。字符串是immutable,意味着它们无法更改。每次尝试修改字符串时都会创建一个新字符串;因此,以下代码将保持名为first的字符串不变:

String first = "first";    // First points to mem address e.g., 0x1
String second = first;     // Second also does
second = "something else"; // Second now points to 0x2, first still to 0x1

对于所有基本类型(int,boolean等),它的行为完全相同。

但是,当您传递对象列表时,列表内容的更改将随处更改。这是因为您的对象共享相同的列表引用(它本身不会更改,只有它的内容)。