gs = (GlobalState) getApplication();
然后我声明了引用共享变量的局部变量,例如:
boolean localStr = gs.str;
现在我认为这将传递一个引用,因此对localStr的任何更改都将反映在globalstate中的str中。然而,情况似乎并非如此。
在这个庄园中创建的一些变量(例如对象数组)似乎作为参考传递,因此任何更改都反映在globalstate中,但是对于几乎所有其他变量(布尔值,字符串和输出),似乎更改不是反映,因此被复制而不是被引用。
我做错了什么或这是android如何工作,如果是这样我怎么能通过引用传递?感谢。
答案 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等),它的行为完全相同。
但是,当您传递对象列表时,列表内容的更改将随处更改。这是因为您的对象共享相同的列表引用(它本身不会更改,只有它的内容)。