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