需求背景:
A方法调用B方法,再调到C方法,希望A方法的一个局部变量boolean a,可以在B方法和C方法传递和改变。希望在B方法改变这个变量的值,然后控制其值在C方法的作用。
(1)刚开始是下面这样实现的,但是发现,a的值一直没有变,没有实现我的需求。
public class Test {
public static void main(String[] args) {
Test demo = new Test();
boolean a = false;
System.out.println(a); // 方法中定义的a初始化是false
demo.test0(a);//调用方法0()
System.out.println(a); // 经过方法0之后的 a依旧是false
demo.test1(a);//调用方法1
System.out.println(a);// 经过方法1之后的 a依旧是false
}
public void test1(boolean a){
if (a){
System.out.println(a + "test1" );
}
}
public void test0(boolean a){
a= true;
}
}
原因:基本类型的参数传递是按值传递的。在Java中,基本类型的参数传递是将变量的值复制一份传递给方法,而不是传递变量本身。因此,当A方法将变量的值传递给方法B时,B方法对这个值的修改不会影响A方法中原始变量的值。
那继续,那如果基础变量不行,是不是可以考虑成员变量 或者 将变量封装为对象类型,以实现对变量值的共享和修改。
(2)那接下来将基本数据类型boolean修改为Boolean对象是不是就可以了呢?No,这个局部变量的值依旧没有被修改。
public class Test {
public static void main(String[] args) {
Test demo = new Test();
Boolean a = false;
System.out.println(a); // 方法中定义的a初始化是false
demo.test0(a);//调用方法0()
System.out.println(a); // 经过方法0之后的 a依旧是false
demo.test1(a);//调用方法1
System.out.println(a);// 经过方法1之后的 a依旧是false
}
public void test1(Boolean a){
if (a){
System.out.println(a + "test1" );
}
}
public void test0(Boolean a){
a= true;
}
}
原因:这是因为在Java中,Boolean对象也是按值传递的。虽然Boolean是一个引用类型,但是它的值是不可变的。在方法B中修改它的值的时候,实际上是创建了一个新的Boolean对象,而不是修改原始对象。 因此无法在方法中直接修改Boolean对象的值。对于Boolean这种包装类对象,它是不可变的,也即是说一旦创建就无法修改其值。
这是因为在Java中,对于不可变对象(如Boolean、String等)每次对其进行修改时,都会创建一个新的对象来代码新的值。原始的对象保持不变,不受修改的影响。这种设计有助于确保对象的不可变性,从而提供更好的安全性和线程安全性。
最后:利用方法返回值传递局部变量的值
public class Test {
public static void main(String[] args) {
Test demo = new Test();
boolean a = false;
System.out.println(a); // 方法中定义的a初始化是false
a = demo.test0(a);//调用方法0()
System.out.println(a); // 经过方法0之后的 a变成true
demo.test1(a);//调用方法1
System.out.println(a);// 经过方法1之后的 a变成true
}
public void test1(boolean a){
if (a){
System.out.println(a + "test1" );
}
}
public boolean test0(boolean a){
a= true;
return a;
}
}