Может кто-нибудь проверить, где в этом коде не так? Результат должен быть истинным, но X по-прежнему ложным.

setOn(X , true);
System.out.println(X);
}

public static void setOn(boolean mode, boolean onValue) { 
    mode = onValue;
    }
public static boolean X = false;

Я не могу использовать X = onvalue, потому что у меня есть другой режим.

-1
user3456426 24 Мар 2014 в 21:00
1
Сам X никогда не устанавливается в true в этом коде.
 – 
Christophe Roussy
24 Мар 2014 в 21:02

3 ответа

Лучший ответ

Метод setOn получает копию X и устанавливает для it значение onValue, но не изменяет исходную переменную X.

Но ему даже не требуется X в качестве параметра, предположительно потому, что он уже находится в области видимости в классе, в котором находится этот код. Просто установите для X значение onValue без {{X3} } параметр.

public static void setOn(boolean onValue) { 
   X = onValue;
}
4
rgettman 24 Мар 2014 в 21:02
Я не могу x= onValue, у меня есть еще 2 режима public static boolean A = true и т. д.
 – 
user3456426
24 Мар 2014 в 21:05
Наличие другой переменной A не мешает вам установить X. Если у вас есть несколько переменных boolean для установки, используйте отдельный метод для каждой, вместо того, чтобы пытаться написать один метод для установки их всех.
 – 
rgettman
24 Мар 2014 в 21:08
И вообще, поскольку X является общедоступным, и вызывающая сторона может получить к нему прямой доступ, этот метод совершенно бесполезен. Вызывающий может просто использовать X = true.
 – 
JB Nizet
24 Мар 2014 в 21:10
Но тогда у меня будет 3 похожих метода, которые мне не нужны. Есть ли способ объединить в один?
 – 
user3456426
24 Мар 2014 в 21:11
Если вы измените его на закрытый, как вызывающий может передать X методу, если у него не будет к нему доступа?
 – 
JB Nizet
24 Мар 2014 в 21:14

Вы не изменили значение X, потому что setOn() получил новую копию X. вы должны сделать что-то вроде этого:

public static void setOn(boolean onValue) { 
    X = onValue;
}
0
Salah 24 Мар 2014 в 21:02

Расширяя ответ дальше:

  1. если передано логическое значение, то java работает с вызовом по значению, потому что это базовый тип данных.
  2. если передано Boolean, тогда java работает с Call by Reference, но поскольку Boolean неизменяем, фактическое значение нельзя изменить, но то, что мы будем использовать, будет новым экземпляром Wrapper для Boolean.

Вы можете воспроизвести ту же проблему, также передав String. вы получите четкое представление о неизменности.

Относятся к неизменяемости java, классам Wrapper и автобоксу.

http://www.javaranch.com/journal/2003/04/immutable.htm

0
shreyas K N 24 Мар 2014 в 22:07