java - общедоступная статическая строка get "reference" - PullRequest
0 голосов
/ 12 марта 2012

Я не понимаю что-то относительно открытых статических строк.У меня есть пара переменных, к которым нужно обращаться глобально (я знаю, что это не настоящий ОО-подход).Если я передам «ссылку» на общедоступную статическую String str из класса Globals, любое изменение, внесенное в значение в 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 ]

4 голосов
/ 12 марта 2012

Ваш охват неоднозначен. Вы имели в виду это:

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;
}

Надеюсь, это поможет.

3 голосов
/ 12 марта 2012

Это потому, что вы не вызываете «глобальную» переменную str, а вместо этого вызываете локальную переменную класса str.

Без дополнительной информации о том, какую переменную str вы хотите изменить, Java будет использовать самую узкую переменную с заданным именем. Точно так же, как вы сделали с this.str в конструкторе, чтобы указать, что вам нужна закрытая переменная экземпляра класса SomeClass, вам нужно будет сделать Globals.str, чтобы указать, что вы хотите переменную public static str, которую вы используете в качестве глобальной .

Кроме того, как уже отмечали другие, String являются неизменяемыми в Java, поэтому то, что вы действительно делаете, когда назначаете любую переменную типа String, это изменяет String, на которую ссылается переменная.

2 голосов
/ 12 марта 2012
public class Globals{

public static String str;

}

public class SomeClass{

private String str;

}

Эти 2 строки не являются одной и той же строкой (вы должны изменить одно из их имен). Для доступа к str в Globals вам нужно будет использовать Globals.str. Кроме того, строки являются неизменяемыми, поэтому вы фактически не изменяете строку, а создаете новую строку и присваиваете значение новой.

2 голосов
/ 12 марта 2012

Это потому, что в Java параметры передаются по значению, а не по ссылке. Таким образом, присвоение нового значения объекту String не видно вне метода. Вы можете использовать обертку для достижения этого:

class StringWrapper {
    public String value;
}

public void setString(StringWrapper wrapper) {
    wrapper.value = "some value"; // the String inside wrapper is changed
}
2 голосов
/ 12 марта 2012

Переменная класса str объявляется статически для класса Globals, а не для каждого класса в приложении. Str в Someclass не имеет отношения к str в Globals - у них просто один и тот же идентификатор.

1 голос
/ 12 марта 2012

Изменение:

this.str = str;

Кому:

Globals.str = str;
1 голос
/ 12 марта 2012

Строки являются неизменяемыми.

Вы передаете ссылку на неизменяемый экземпляр String, а не на переменную str.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...