Java入参细节
今天遇到一个问题,关于函数传入参数引用指向其他对象时,原来的引用会随之指向新的对象吗?现在用代码实验一下
- 改变传入参数引用指向的对象
public class Test{
static class Inner{
int count =0;
}
public static void main(String[] args) {
Inner in = new Inner();
in.count = 1;
test(in);
System.out.println(in.count);//结果还是1
}
private static void test(Inner in) {
in = new Inner();
in.count = 10;
}
}
- 改变引用指向的对象的成员变量的值
public class Test{
static class Inner{
int count =0;
}
public static void main(String[] args) {
Inner in = new Inner();
in.count = 1;
test(in);
System.out.println(in.count);//结果变为10
}
private static void test(Inner in) {
//in = new Inner();
in.count = 10;
}
}
- 查看方法内外引用指向的对象的地址
public class Test{
static class Inner{
int count =0;
}
public static void main(String[] args) {
Inner in = new Inner();
in.count = 1;
System.out.println(in);
test(in);
System.out.println(in.count);//结果还是1
}
private static void test(Inner in) {
System.out.println(in);
in = new Inner();
System.out.println(in);
in.count = 10;
}
}
结果
ceshi.StringTest$Inner@15db9742
ceshi.StringTest$Inner@6d06d69c
ceshi.StringTest$Inner@15db9742
1
- 基本数据类型
public class Test{
public static void main(String[] args) {
int i = 0;
test(i);
System.out.println(i);//仍然是0
}
private static void test(int i) {
i++;
}
}
总结:
通过实验可以看出,修改传参指向新的对象,并不会影响方法外的引用,这里可以理解为这个方法参数是一个新的引用,而如果直接修改引用指向对象的成员变量,方法外引用指向的对象也随之被修改,这里可以理解为是对引用指向的对象直接进行修改,修改的对象是同一个。而对于基本数据类型,在方法内修改入参的值,并不会修改到方法外原来的值。