昨天遇到一个问题,记下来,以便以后方便
我们都知道C中可以一个变量的地址(指针)当做参数传递给方法,java能吗?
public class JavaTest {
public static void main(String[] args) {
int a = 10;
int b = 5;
// int
System.out.println("a=" + a + "\tb=" + b);
new JavaTest().changeIntA(a, b);
System.out.println("a=" + a + "\tb=" + b);
// List
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
System.out.println("list.size:"+list.size());
new JavaTest().changeList(list);
System.out.println("list.size:"+list.size());
}
public void changeIntA(int a, int b) {
a=a+1;
b=b+1;
}
public void changeList(List list){
list.add("4");
}
}
运行程序结果:
a=10 b=5
a=10 b=5
list.size:3
list.size:4
通过这个简单程序发现方法参数值如果是List是可以改变的,但是如果是int就不能。
刚开始我认为应该是int是基本类型,而List是java封装类型,而封装类型是引用,基本类型可能是
传值。
所以那把int改成Integer类型应该会没问题了,但是结果还是没变化。
上网上查了一下也没找到能解释清楚的,如果真要是改变方法参数值,可以使用全局变量
public class JavaTest {
private static int a;
private static int b;
public static void main(String[] args) {
JavaTest test = new JavaTest();
test.a = 10;
test.b = 5;
// int
System.out.println("a=" + test.a + "\tb=" + test.b);
new JavaTest().changeIntA(test.a, test.b);
System.out.println("a=" + test.a + "\tb=" + test.b);
}
public void changeIntA(int a, int b) {
this.a=a+1;
this.b=b+1;
}
}
这样做好像也不是很好,感觉也没什么意义。
当然如果把a,b都封装到一个类中,肯定就行了,因为类引用的是对象地址
public class JavaTest {
public static void main(String[] args) {
IntTest intTest = new IntTest();
intTest.setA(1);
intTest.setB(2);
int a = intTest.getA();
int b = intTest.getB();
// int
System.out.println("a=" + a + "\tb=" + b);
new JavaTest().changeIntA(intTest);
System.out.println("a=" + intTest.getA() + "\tb=" + intTest.getB());
}
public void changeIntA(IntTest intTest) {
intTest.setA(3);
intTest.setB(4);
}
}
class IntTest{
private int a;
private int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
这里结果是:
a=1 b=2
a=3 b=4
但是有地方没想通,为什么Integer类不是说是java中封装类吗,按道理应该引用地址,应该能改变
参数值,为什么不行呢
原来如果定义成Integer a=Integer(1)
其实Integer.class中构造方法只是
public Integer(int value) {
this.value = value;
}
所以值还是int基本类型。
所以通过这里得出结论:
不管定义成int还是list都是局部变量,而java中没有指针,所以没法传递地址,而list本身应该是
地址引用。
想到这里先写这么多,做个简单笔记,不对地方望大神指出