0

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

public void someMethod(int a, int b){
a = 5;
b = 6;
}

//.. imagine a main method is written here..
{
int x = 23;
int y = 14;
someMethod(x,y);
System.out.println(x + " " + y);

}

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

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

4

7 回答 7

3

Java 是按值传递的

这实际上意味着生成了值的副本,这就是传递给函数的内容。

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

例如,给定一个具有属性 Y 的类型 X 的对象,这将被视为调用代码:

public void doSomthing(X obj)
{
  obj.setY("some value");
}

但这不会是:

public void doSomthing(X obj)
{
  obj = new X(); 
}
于 2013-05-02T07:07:29.257 回答
2

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

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

所以函数中参数的改变会影响参数(a),但不会影响调用函数(x)中传递的参数。

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

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

如果您希望在方法内更改某些原始变量的值,则该变量的范围也应该在方法之外可用,并且该方法应该能够访问它。只有这样,对变量的更改才会在外部生效。

于 2013-05-02T07:06:16.687 回答
1

原语

xy是局部变量(因为它们是按值传递的),您需要将它们存储在方法之外,以便通过someMethod().

int x;
int y;

public void someMethod(){
x = 5;
y = 6;
}

//.. imagine a main method is written here..
{
int x = 23;
int y = 14;
someMethod();
System.out.println(x + " " + y);

}

这将打印“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");
}
于 2013-05-02T07:06:00.047 回答
1

Java中的变量是按值传递的。因此,当您传递xand时,andy被传递给它,并且在内部,方法中发生的任何事情都本地化到它。而在打印时,参考包含相同的值 23、14。xyxy

于 2013-05-02T07:06:43.403 回答
1

每当一个方法被调用并传递一些参数时,然后在运行时通过匹配方法的签名来决定执行哪个方法。

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

于 2013-05-02T07:07:02.537 回答
0

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

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);
    }
}
于 2013-05-02T07:12:38.567 回答
0

从调用者的角度来看,原语不能改变。

只有(非原始)可变对象参数可以更改其值。

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

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

当调用者恢复执行时将被更改。

于 2013-05-02T07:05:01.550 回答