2012-03-12 2 views
0

Я ничего не понимаю относительно публичных статических строк. У меня есть пара переменных , к которым нужно обратиться глобально (я знаю, что это не истинный подход OO). Если я передаю «ссылку» публичной статической строки String из класса Globals, любое изменение, внесенное в значение в SomeClass, не будет обновлять эту переменную .java - public static String get "reference"

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 

    } 
+4

Почему вы предполагаете, что два 'str'-поля (одно в« Глобалах »и в« SomeClass ») были связаны? Можете ли вы дать нам свой вызов 'setStr()'? –

ответ

3

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

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

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

+3

Он ничего не переоценивает – blank

+0

@BedwyrHumphreys - Хороший момент.Сначала я пропустил прочтение кода. Я исправил свой ответ, чтобы отразить это. Спасибо. – cdeszaq

1

Строки неизменяемы.

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

+0

Струны действительно могут быть неизменными, но в этом случае они не имеют никакого отношения. – blank

+0

@BedwyrHumphreys: Он может подумать, что он мутирует существующий экземпляр. – SLaks

2

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

2

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

class StringWrapper { 
    public String value; 
} 

public void setString(StringWrapper wrapper) { 
    wrapper.value = "some value"; // the String inside wrapper is changed 
} 
+0

Это верно только для примитивов. Объекты передаются по ссылке. – twain249

+1

@ twain249, нет, объекты вообще не передаются. (Однако ссылки на объекты передаются, но они также по значению.) – aioobe

+0

Ссылка на 'String' по-прежнему передается по значению. Назначение другой ссылки на параметр «String» не будет отображаться снаружи. – Tudor

2
public class Globals{ 

public static String str; 

} 

public class SomeClass{ 

private String str; 

} 

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

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

Хотелось бы надеяться, что помогает.

+0

Технически область видимости _not_ неоднозначна. В правилах определения Java требуется, чтобы без дополнительных индикаторов cope, таких как 'this' или' ClassName' или 'classInstance', использовалась самая маленькая переменная с указанным именем. Тем не менее, ваши примеры _до_ делают различие более ясным. – cdeszaq

+0

Согласовано. Я имел в виду, что этот вопрос был неоднозначным, так как я не был уверен, какую область действия OP хотел бы использовать. – kaliatech

+0

@kaliatech 2nd. спасибо – jadrijan

Смежные вопросы