public class Class3 { public static void main(String[] args) {
int i=5;
int j[]={1,2,3,4};
StringBuffer sb=new StringBuffer("abcde");
a(i,j,sb);
System.out.println("i=="+i);//为什么i的值是5而不是7?
System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1。
}
static void a(int i,int j[], StringBuffer sb){
i=7;
j[0]=11;
sb.append("fghij");
}
}在程序的注释中已经表示了我的疑问,希望大家能帮我解决这个问题。
int i=5;
int j[]={1,2,3,4};
StringBuffer sb=new StringBuffer("abcde");
a(i,j,sb);
System.out.println("i=="+i);//为什么i的值是5而不是7?
System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1。
}
static void a(int i,int j[], StringBuffer sb){
i=7;
j[0]=11;
sb.append("fghij");
}
}在程序的注释中已经表示了我的疑问,希望大家能帮我解决这个问题。
打印的i指的是 main中定义的i,不是在a()中定义的
在a函数里面传入的是数组名,也就是数组的引用,相当于地址,所以在该函数中就
是直接对传入得参数进行的修改
j[0]=11; //改变了j 所指向对象的值,j仍然和main中的j指向同一个地址,且修改了这个地址中对象的值
sb.append("fghij");// 同上
--------------------------------------------------
这个没有问题打印的是main中定义的i,a()中只是修改了形参,不影响实参.java是值传递的.调用static void a(int i,int j[], StringBuffer sb)的时候,
实参 j[]={1,2,3,4}和形参指向了同一个地址!对形参的修改影响到了实参.
所以 "System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1"也没有问题.
首先,java是以传值方式传递参数的,所以传i时实际是传的i的一个拷贝,对这个拷贝的修改并不影响原i的值
而当你传对象的引用时,传进去的也是那个引用的拷贝,但拷贝和原来的引用都指向同一个内存地址,即同一个对象,所以你在方法中当然会修改掉以前的那个数组。因为数组也是对象,它是存在堆中的,而不象基本数据类型一样在栈里
cat_871017(零下九度)的解释,
应该把他运行时 内存 的分配画个图;
理解就容易一些