首先,需要理解Java中两种数据类型传递方式:值传递和引用传递。值传递是指在方法调用时传递的是实际的值,而引用传递则是指传递的是对象的引用。
值传递(Value Passing)
Java中的基本数据类型,如int、float、boolean等都是通过值传递的方式进行传递。这意味着,当你将一个基本数据类型作为参数传递给一个方法时,它会复制参数的值,并将其传递给方法。在方法内部对参数的任何更改都不会影响到原始参数的值。以下是一个值传递的示例:
public class ValuePassingExample {
public static void main(String[] args) {
int x = 5;
changeValue(x);
System.out.println("x = " + x);
}
public static void changeValue(int a) {
a = 3;
}
}
输出:
x = 5
在上面的代码中,我们定义了一个 x
变量并给它赋值为 5。然后调用 changeValue
方法,并将 x
作为参数传递。在 changeValue
方法内部,我们将 a
的值更改为 3。然而,当我们回到主方法,我们发现 x
的值仍然是 5。这就是因为在方法调用中传递给参数的值被复制到方法内部,而且方法内部对这个值的改变不会影响原来的值。
引用传递(Reference Passing)
与值传递不同,Java 引用传递只传递对象的引用,这意味着在方法中调用参数时,它实际上是调用了对象的引用。这样,当在方法中修改对象时,对原始对象的改变是可见的。示例代码:
public class ReferencePassingExample {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.setVal(10);
changeReference(obj);
System.out.println("obj.val = " + obj.getVal());
}
public static void changeReference(MyClass a) {
a = new MyClass();
a.setVal(20);
}
}
class MyClass {
private int val;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return val;
}
}
输出:
obj.val = 10
在这个例子中,我们定义了一个 MyClass 类,其中包含一个 val 成员变量和相应的 getter 和 setter 方法。在主方法中,我们实例化了一个 MyClass 类型的对象,然后设置了它的值为 10。接下来调用了 changeReference
方法,并将刚才实例化的对象作为参数传递。在 changeReference
方法内部,我们创建了一个新的 MyClass 类型的对象,并将其引用分配给本地变量 a
,然后将 val 成员变量的值设置为 20。
当 changeReference
方法完毕时,控制流回到主方法,我们发现对象的值仍然为 10。与值传递不同,Java 引用传递仅传递对象的引用,因此在方法调用中传递的实际上是对象的引用,而不是对象本身。这就是为什么在 changeReference
方法中对初始对象的任何更改不会影响原来的对象值,而是会影响方法内部的本地变量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java通过实例了解值传递和引用传递 - Python技术站