【问题标题】:How we can get Boolean value updated through other method in main method我们如何通过 main 方法中的其他方法更新布尔值
【发布时间】:2014-08-07 22:42:28
【问题描述】:

请忽略格式和句子相关的问题。

class ABC 
{   
 public void change(Boolean x, Boolean y, StringBuffer s)
 {
    x=true;
    y=true;
    s.append("vinay");
 }

 public static void main(String a[])
 {
    Boolean x = false;
    Boolean y = false;
    x=false;
    y=false;
    StringBuffer s = new StringBuffer();
    s.append("jasi");
    ABC p= new ABC();
    p.change(x,y,s);

    System.out.println(x);
    System.out.println(y);
    System.out.println(s);      
 }
}

我想在 main() 方法中为布尔 x,y 获取我在 change() 方法中所做的所有更改,因为我们在 main 函数中修改了 s。 有什么方法可以让我们在 main 方法中获得修改后的值。

【问题讨论】:

  • 注意java是按值传递的,所以你不能改变参数。
  • 你甚至无法看到单线程程序的变化,因为传值。
  • 没关系,但是为什么我们会在 StringBuffer object 的情况下获得更新的值。请澄清一下。

标签: java


【解决方案1】:

Java 是按值传递的,因此当您在此处传递布尔值 p.change(x,y,s); 时,它将被视为按值传递,并且当您从 change 方法初始化布尔值时

x=true;
y=true;

它不会获取该引用,但会在超出范围时被销毁

【讨论】:

  • 先生,但我们正在传递对象以更改方法,因为我们正在传递 s
  • @VinaySharma 将所有布尔值作为全局变量
【解决方案2】:

选项:

  1. 将变量放在两个方法之外(作为类变量)
  2. 创建一个数组(用于引用地址而不是值)。
  3. 创建一个包含这两个 Boolean 值的新对象(创建一个新类或使用 ArrayList/HashMap/等)
  4. AtomicBoolean

选项 1:

class ABC 
{   
    Boolean x = false;
    Boolean y = false;
    public void change(StringBuffer s)
    {
        //code
    }

     public static void main(String a[])
     {
         //code
         p.change(s);
         //code 
     }
}

选项 2:

class ABC 
{   
    public void change(Boolean b, StringBuffer s)
    {
         b[0] = true;
         b[1] = true;
        //code
    }

     public static void main(String a[])
     {
         Boolean[] b = new Boolean[2];
         b[0] = false;
         b[1] = false;
         //code
         p.change(b, s);
         //code 
     }
}

【讨论】:

  • 可能也想要volatile
  • 翻转支架。添加;
  • @user3580294 添加volatilestatic 将取决于OP 的要求。不一定非得如此,但我会提到它。
  • 糟糕,由于某种原因,我将标题读作“...通过 main 方法中的其他 thread 更新”。无视我说的话; volatile 在这里不是必需的,因为不涉及线程。显然我需要新眼镜。
  • 实际上有一些限制我们不能将这些变量作为类级别。在我的要求中。
【解决方案3】:

您可以将您的布尔值转换为静态变量,您将使用 ABC.x 调用它们并使用 public static boolean x; 在类之后定义它看起来像

class ABC 
{
    public static boolean x;

【讨论】:

    【解决方案4】:

    在 Java 中,参数是按值传递的,而不是作为指针传递的,因此您传递给函数的变量会将它们的值复制到方法中的局部变量中,因此所有更改只会影响该局部副本。

    你可以做的是获取全局变量,或者返回你的函数。

    att.

    【讨论】:

      【解决方案5】:

      Java 按值传递参数,因此在您的change() 方法中所做的所有更改对调用者都是不可见的。

      为了做你想做的事,你可以: 1.将此变量定义为类成员。 2.将它们作为方法的返回值返回。是的,您只受一个返回值的限制,但如果您想创建布尔数组或创建包含两者的特殊类。 3. 您可以将方法传递给包含布尔值的可变容器。其中一种方法是为此使用AtomicBoolean

      public void change(AtomicBoolean x, AtomicBoolean y, StringBuffer s) {
          x.set(true);
          y.set(true);
          s.append("vinay");
      }
      
      public static void main(String a[]) {
          AtomicBoolean x = new AtomicBoolean(false);
          Boolean y =  = new AtomicBoolean(false);
          change(x, y);
          System.out.println(x.get() + ", " + y.get()); // will print true true
      }
      

      【讨论】:

      • 先生,但如果是 StringBuffer 对象,我们会得到更新的值吗?
      • 那是因为可以修改 StringBuffer 对象。使用参考,您可以更改它。但是 StringBuffer 引用参数是按值传递的。这意味着如果你让 s 指向不同的对象,它仍然会指向 change() 函数之外的原始对象。
      • 包含布尔值的可变容器是什么意思
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多