[英]Passing objects to methods java
我正在使用三个对象: StringBuilder
, Integer
和testobject
- 它们被传递给一个方法来改变它的状态。
正如所料, StringBuilder
和testobject
指向同一个对象,状态发生了变化,但它不适用于Integer
对象。
class testobject{
int x = 1;
}
public class test{
public static void main(String[] args){
StringBuilder s1 = new StringBuilder("String");
go(s1);
System.out.println(s1);
Integer s2 = new Integer("20");
go1(s2);
System.out.println(s2);
testobject s3 = new testobject();
go2(s3);
System.out.println(s3.x);
}
static void go(StringBuilder s1){
s1.append("Builder");
}
static void go1(Integer s2){
s2 = 1;
}
static void go2(testobject s3){
s3.x = 5;
}
结果:
StringBuilder
20
5
预期结果:
StringBuilder
1
5
看看你的三种方法:
static void go(StringBuilder s1){
s1.append("Builder");
}
static void go1(Integer s2){
s2 = 1;
}
static void go2(testobject s3){
s3.x = 5;
}
在go
和go2
,您正在修改参数值所引用的对象。
在go1
,您正在更改参数变量本身的值。 这是非常不同的,因为Java总是使用pass-by-value ,调用者看不到这种变化。
重要的是要理解对象根本不会传递给方法。 相反,引用是。 s1
, s2
和s3
的值都是引用。 如果你觉得这些变量的像张纸,每张纸上有一所房子的地址,这是在宣布一张纸上复印main
。
go
和go2
的方法体就像访问地址在纸上的房子,并在前门上画画。 如果您使用原始纸张访问房屋,您仍然可以看到前门上的新颜色。
go1
的方法体就像go1
在纸上的地址,然后在那里写一个新地址。 这不会改变房子,也不会改变原始的纸张。
如果要传递的参数是对象而不是基本类型,则Java将按对象传递视为按值传递,因为Java支持按值传递概念。
这里a和p是相同的参考:
public class ObjPass {
int value;
public static void main(String[] args) {
ObjPass p = new ObjPass();
p.value = 5;
System.out.println("Before calling: " + p.value);
increment(p);
System.out.println("After calling: " + p.value);
}
public static void increment(ObjPass a){
a.value++;
}
}
输出:
Before calling: 5
After calling: 6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.