更改函数参数的值?

LRF*_*LEW 7 java function

这可能看起来像一个愚蠢的问题,但这个函数实际上会影响变量bool(我将如何使用它有更大的背景,但这基本上是我不确定的)?(我具体询问java)

void truifier (boolean bool) {
    if (bool == false) {
        bool = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

poh*_*ohl 16

考虑一个稍微不同的例子:

public class Test {

    public static void main(String[] args) {
        boolean in = false;
        truifier(in);
        System.out.println("in is " + in);
    }

    public static void truifier (boolean bool) {
        if (bool == false) {
            bool = true;
        }
        System.out.println("bool is " + bool);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此程序的输出将是:

bool is true
in is false
Run Code Online (Sandbox Code Playgroud)

bool变量将改为真实的,但只要truifier方法返回,这样的说法变消失(这是当他们说,它"超出范围"是什么意思的人).但是,in传递给truifier方法的变量保持不变.

  • 谢谢pohl !! 能够通过传递对象来做到这一点.但是,知道java的作用是值得传递,这真的令人惊讶和安静很重要.它在原语的情况下传递值,在对象的情况下传递值.在基元的情况下,值不能改变.并且在引用的情况下,对象的值可以被修改但是不能被分配给新对象.我在墙上撞到我的头,为什么我在递归函数中传递的原始参数没有被更新.:) .. (4认同)
  • 谢谢。这解释了我所问的问题。谢谢。 (2认同)
  • 需要说明的是,bool变量在调用方法中不会更改。在调用的方法中创建变量的新副本。您可以随意更改它,但是此var与调用方法中的var不同。但是,如果您的参数是一个指针,则被调用方法中的任何更改都将直接影响调用方法中的对象,因为未在被调用方法中创建变量的新副本。 (2认同)
  • @AKS在Java中实现这一目标的唯一方法是使用可变字段传递对象的引用,允许该方法改变对象的字段. (2认同)

Max*_*nna 7

但是,如果您没有使用布尔值,而是使用对象,则参数可以修改对象.正如另一个响应所指出的,当作为参数传递时,将在本地为您的truifier函数创建一个布尔值,但是一个对象将按位置引用.因此,根据您使用的参数类型,您可以得到两个非常不同的结果!

class Foo {
        boolean is = false;
}
class Test
{

    static void trufier(Foo b)
    {
        b.is = true;
    }
    public static void main (String[] args)
    {
        // your code goes here
        Foo bar = new Foo();
        trufier(bar);
        System.out.println(bar.is);
    }
}
Run Code Online (Sandbox Code Playgroud)

//这个代码输出正确

  • 这个答案而不是公认的答案为OP中的隐含问题提供了解释。 (3认同)