Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法何时更改参数的变量/参数的值?_Java - Fatal编程技术网

Java 方法何时更改参数的变量/参数的值?

Java 方法何时更改参数的变量/参数的值?,java,Java,正如标题所述,方法何时更改参数的变量/参数的值? 例: 编译后,结果是23 14正在打印。但是,何时修改变量的值 我知道它可以通过使用mutators进行修改(假设传递的参数是一个对象),但是还有其他方法吗 不能从调用者的角度更改原语 只有(非基本)可变对象参数的值可以更改 例如,传递给此方法的日期对象: public static void example(Date date) { date.setTime(0); } 将在调用方恢复执行时更改。原语 x和y是局部变量(由于它们是通过

正如标题所述,方法何时更改参数的变量/参数的值? 例:

编译后,结果是23 14正在打印。但是,何时修改变量的值


我知道它可以通过使用mutators进行修改(假设传递的参数是一个对象),但是还有其他方法吗

不能从调用者的角度更改原语

只有(非基本)可变对象参数的值可以更改

例如,传递给此方法的日期对象:

public static void example(Date date) {
    date.setTime(0);
}

将在调用方恢复执行时更改。

原语

x
y
是局部变量(由于它们是通过值传递的),因此需要将它们存储在方法之外,以便注意
someMethod()
的任何更改

这将打印“5 6”而不是“23 14”。原语没有引用,这就是为什么;)

对象

对象通过引用传递:

//main method
{ 
    Dog dog = new Dog("Max");
    someMethod(dog);
    System.out.println(dog.getName()); // Yay, dog is named Fifi
}

void someMethod(Dog dog) {
    dog.setName("Fifi");
}

整数是所谓的基元类型。传递整数将复制其值并将其分配给参数

但该值不是对实际数据的引用,而是数据本身

因此,对函数中参数的更改将影响参数(a),但不会影响调用函数(x)中传递的参数

请注意: 当我们谈论变数时,我们谈论的是修改/更新类级变量的值。变量的范围是类级别

因此,即使将某些值传递给mutator,实际的参数值也将保持不变,除非它是非原语类型


如果您希望在方法内部改变某个基本变量的值,那么该变量的作用域也应该在方法外部可用,并且该方法应该能够访问该变量。只有这样,对变量的更改才会在外部有效

变量在Java中按值传递。因此,当您传递
x
y
时,
x
y
的值被传递到它,并且在方法内部发生的任何事情都被定位到它。然而,当打印时,
x
y
引用包含相同的值23和14。

每当调用一个方法并传递一些参数时,则在运行时通过匹配该方法的签名来确定要执行的方法

您可以参考fro了解有关方法调用的更多信息。

Java是

这实际上意味着创建了值的副本,这是传递给函数的内容

当您将一个对象传递给一个方法时,就会出现混淆。在这种情况下,复制的是对对象的引用

例如,给定一个具有属性Y的X类型的对象,可以看到调用代码:

public void doSomthing(X obj)
{
  obj.setY("some value");
}
但这不会是:

public void doSomthing(X obj)
{
  obj = new X(); 
}

整数、浮点、双精度等不是对象,因此永远不会通过将它们传递到方法中,然后在方法中更改它们来进行修改。但是,在方法中修改的对象将在其引用的所有位置保留该更改。但是,“替换”的更改不会持续,请参见下面我的意思:

public class Test{
    int x;



    public Test(int x) {
        this.x = x;
    }
    public void setX(int x){
        this.x=x;
    }
    public int getX(){
        return x;
    }


    public static void main(String[] args){

        Test test=new Test(5);
        System.out.println(test.getX()); //its 5

        testChange(test); 
        System.out.println(test.getX()); //its 7 because the change persists

        testChange(test); 
        System.out.println(test.getX()); //its still 7! Because we changed the object for a new one within the method, we didn't modify it

    }

    private static void testChange(Test aToBeChanged){
        aToBeChanged.setX(7);
    }
    private static void testReplace(Test aToBeReplaced){
        aToBeReplaced=new Test(10);
    }
}

这并不复杂,因为您的主方法不了解
a
b
…请阅读java中的传递值。好吧。。。编译并运行。您将看到,您没有完全掌握Java语言的函数范围。对不起,这是我的错误。我写错了变量。。虽然OP只是在
someMethod()
中设置局部变量,但很可能这个类也有这些属性。我确实理解这一点,但是除了使用变异子来改变变量的值,还有其他方法吗?(不限于原语类型)使用询问更新了答案,假设不使用全局变量:如果是这样,您应该使用对象而不是原语。对象是通过引用而不是值传递的。@muddayard:请参阅我的编辑;)(我的错误是在我的第一篇文章中不够具体,但我很困,但需要为这次考试学习:P)我确实理解可以通过使用mutator(setName方法)来更改对象,但我想知道是否有其他方法可以在不使用mutator的情况下更改变量的值。(假设没有使用全局变量)如果
Dog
name
是公共的,您可以说
Dog.name=“fififi”未使用任何
set
方法。我认为
整数
的行为方式与这只
的行为方式相同。您可以轻松设置为
int
整数x=5。虽然我不能100%确定这是通过值还是通过引用传递,但如果您感兴趣,应该对此进行测试。所有内容都是通过值传递的,甚至是对象,因为它们的引用是一个值。对象本身没有传递。对,对象引用也是按值传递的。
public void doSomthing(X obj)
{
  obj = new X(); 
}
public class Test{
    int x;



    public Test(int x) {
        this.x = x;
    }
    public void setX(int x){
        this.x=x;
    }
    public int getX(){
        return x;
    }


    public static void main(String[] args){

        Test test=new Test(5);
        System.out.println(test.getX()); //its 5

        testChange(test); 
        System.out.println(test.getX()); //its 7 because the change persists

        testChange(test); 
        System.out.println(test.getX()); //its still 7! Because we changed the object for a new one within the method, we didn't modify it

    }

    private static void testChange(Test aToBeChanged){
        aToBeChanged.setX(7);
    }
    private static void testReplace(Test aToBeReplaced){
        aToBeReplaced=new Test(10);
    }
}