java - public static String get“reference”

时间:2012-03-12 15:40:29

标签: java string static public

我不了解公共静态字符串。我有几个 需要全局访问的变量(我知道这不是真正的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

    }

7 个答案:

答案 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;