【问题标题】:Permanent change of a variable in static method静态方法中变量的永久更改
【发布时间】:2014-12-27 19:49:45
【问题描述】:

假设我有一个带有静态方法的公共类,例如其中之一:

 public static void test(boolean b){
   b = !b;
 }

假设这个类名是Test。从另一个类,我有一个变量 boolean a = false,我调用

 Test.test(a);

我怎样才能让它永久改变,而不仅仅是在那个静态方法范围内改变它?

【问题讨论】:

  • 您能解释一下为什么要这样做,因为可能有更好的方法来解决您的实际问题。
  • 我知道如何绕过它,我只是不知道这是否可能,所以我想问:)
  • 那么答案是不要那样做,做别的。动态更改代码不是一个简单的过程。您应该考虑更改字段。
  • 请记住,函数不会接收您传递给它们的变量;他们接收这些变量的值。他们可以更改存储的值,但不能更改变量。请参阅“Java 是“按引用传递”还是“按值传递”?

标签: java class variables methods static


【解决方案1】:

使更改永久化的唯一方法是让方法具有返回值并将其分配给变量:

public static boolean test(boolean b){
   return !b;
}

a = Test.test(a);

【讨论】:

  • 你确定这是唯一的方法吗?如何一次更改两个变量?
  • @Greyshack:你不知道。如果您需要更改多个变量,则几乎可以肯定地将这些变量的组合封装在一个类中。
  • @Greyshack 一次更改两个变量是不可能的。如果变量是对可变对象的引用,则可以更改对象的属性,但不能更改引用本身。
【解决方案2】:

听起来你在寻找一个可变 Boolean,其中最简单的是AtomicBoolean

private void changeIt(AtomicBoolean b) {
    b.set(!b.get());
}

public void test() {
    AtomicBoolean b = new AtomicBoolean(false);
    changeIt(b);
    System.out.println(b);
}

【讨论】:

    【解决方案3】:

    使用静态字段:

    public static boolean flag;
    
    public static void test(boolean b){
        flag = !b;
    }
    

    然后:

    boolean a = true;
    Test.test(a);
    
    System.out.println( Test.flag); // false
    

    【讨论】:

      【解决方案4】:

      您可以将实例传递给方法并使用 setter 一次更改更多变量。

      public static void updateData(MyClass instance) {
          instance.setX(1);
          instance.setY(2);
      }
      

      【讨论】:

        【解决方案5】:

        在您的 Test 类中,您可以将布尔变量定义为 static

        public static boolean a;
        

        在类之外使用Test.a=false;a=Test.a 更改或访问它

        如果你需要使用方法,你可以通过继承隐藏静态方法:

        public class HideStatic {     
        public static void main(String...args){  
            BaseA base = new ChildB();  
            base.someMethod();        
        }  
        }  
        
        class BaseA {         
            public static void someMethod(){  
                System.out.println("Parent method");  
            }  
        }  
        
        class ChildB extends BaseA{  
            public void someMethod(){  
                System.out.println("Child method");  
            }  
        }
        

        【讨论】:

        • 好的,但是这样我在类中就有了静态方法的变量,如果我想在不同的类中有不同的变量并使用该方法怎么办?
        • 那么如何使用继承静态持有者类的新类来隐藏它们呢? (我编辑了答案)
        【解决方案6】:

        我想你要的是call by reference。你可以通过使用数组在 Java 中获得它:

        public static void test(boolean[] b){
        b[0] = !b[0];
        }
        
        boolean[] param = new boolean[] {a};
        test(param);
        a=param[0];
        //a changed
        

        这可行,但很难看。如果您需要返回多个值,请查看the Pair or Tuple 结构。

        【讨论】:

        • 好吧,这是有道理的,在 c,c++ 中,数组也是指向第一个元素的指针。很高兴知道:)
        猜你喜欢
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        相关资源
        最近更新 更多