正如标题所述,方法何时改变参数的变量/参数的值? 例如:
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来修改它(假设传递的参数是一个对象),但还有其他方法吗?
答案 0 :(得分:3)
Java是pass by value!
这意味着实际上是值的副本,这是传递给函数的内容。
出现混淆的地方是将对象传递给方法。在这种情况下,它是对复制对象的引用。
例如,给定一个带有属性Y的X类型的对象,可以看到这是调用代码:
public void doSomthing(X obj)
{
obj.setY("some value");
}
但这不会是:
public void doSomthing(X obj)
{
obj = new X();
}
答案 1 :(得分:2)
整数是所谓的原始类型。传递整数会复制其值并将其分配给参数。
但该值不是对实际数据的引用,而是数据本身。
因此,函数中参数的更改将影响参数(a),但不会影响调用函数(x)中传递的参数。
请注意: 当我们谈论mutators时,我们正在谈论修改/更新类级变量的值。变量的范围是类级别。
因此,即使将一些值传递给mutator,实际参数值仍将保持不变,除非它是非基本类型。
如果您希望在方法中改变某个原始变量的值,那么变量的范围也应该在方法之外可用,并且该方法应该能够访问该方法。只有这样,对变量的更改才会在外部生效。
答案 2 :(得分:1)
<强>基元强>
x
和y
是局部变量(因为它们是按值传递的),您需要将它们存储在方法之外,以便通过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");
}
答案 3 :(得分:1)
变量在Java中按值传递。因此,当您传递x
和y
时,x
和y
的值会被传递到其中,并且内部无论方法发生什么,本地化。而x
和y
在打印时,引用包含相同的值23,14。
答案 4 :(得分:1)
每当调用一个方法并传递一些参数时,就会在运行时决定通过匹配方法的签名来执行哪个方法。
您可以参考link了解有关方法调用的更多信息。
答案 5 :(得分:0)
无法从调用者的角度更改基元。
只有(非原始)可变对象参数可以更改其值。
例如,传递给此方法的Date对象:
public static void example(Date date) {
date.setTime(0);
}
当调用者恢复执行时将被更改。
答案 6 :(得分: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);
}
}