我不了解公共静态字符串。我有几个 需要全局访问的变量(我知道这不是真正的OO方法)。 如果我从Globals类传递public static String str的“引用”,则对SomeClass中的值所做的任何更改都不会更新 那个变量。
public class Globals{
public static String str;
}
public class SomeClass{
private String str;
public void setStr(String str){
this.str = str;
//If I change the value of str in this SomeClass, the value does not get
//updated for the public static String str in Globals class
}
//Here assign new value for str
}
答案 0 :(得分:4)
您的范围不明确。你的意思是:
public void setStr(String str){
this.str = str;
//If I change the value of str in this SomeClass, the value does not get
//updated for the public static String str in Globals class
Globals.str = this.str;
}
或者这个:
public void setStr(String str){
this.str = str;
//If I change the value of str in this SomeClass, the value does not get
//updated for the public static String str in Globals class
this.str = Globals.str;
}
希望这会有所帮助。
答案 1 :(得分:3)
这是因为您没有调用“全局”str
变量,而是调用类本地str
变量。
如果没有关于您想要更改的str
变量的其他信息,Java将使用具有给定名称的最严格范围的变量。就像您在构造函数中使用this.str
表示您想要SomeClass
类的私有实例变量一样,您需要执行Globals.str
来表示您想要public static str
您作为全局使用的变量。
另外,正如其他人所指出的,String
在Java中是不可变的,所以当你分配给String
类型的任何变量时,你真正在做的是改变String
变量正在引用。
答案 2 :(得分:2)
对于Globals类,静态声明str类变量,而不是为应用程序中的每个类声明。 Someclass中的str与Globals中的str无关 - 它们碰巧具有相同的标识符。
答案 3 :(得分:2)
这是因为在Java中参数是按值传递的,而不是引用。因此,在方法之外看不到为String
对象分配新值。您可以使用包装器来实现此目的:
class StringWrapper {
public String value;
}
public void setString(StringWrapper wrapper) {
wrapper.value = "some value"; // the String inside wrapper is changed
}
答案 4 :(得分:2)
public class Globals{
public static String str;
}
public class SomeClass{
private String str;
}
这两个字符串不是同一个字符串(您应该更改其中一个名称)。要访问Globals中的str
,您必须使用Globals.str
。字符串也是不可变的,因此您实际上不会更改字符串,而是创建一个新字符串并将值分配给新字符串。
答案 5 :(得分:1)
字符串是不可变的。
您正在传递对不可变String
实例的引用,而不是对可变str
变量的引用。
答案 6 :(得分:1)
变化:
this.str = str;
要:
Globals.str = str;