Java中的数据类型分为8种基本数据类型【int,string,short,long,double,float,boolean,char】和3种引用型数据类型【数组、类、接口】。 先看一下代码,思考代码的输出结果ia,ib分别等于多少?
public class demo01 {
/*自定义成员方法实现将参数传入的整数修改后打印的功能*/
void setArg(int ia){
ia = 200;
System.out.println("ia= " + ia);//ia=?
}
public static void main(String[] args) {
demo01 demo01 = new demo01();
int ib = 10;
demo01.setArg(ib);
System.out.println("ib= " + ib);//ib=?
}
}
结果是: ia=200,ib=10
原因为:main方法是入口,代码从上往下运行,执行到setArg方法时调用setArg方法,将ib=10复制一份传给ia后,ia又被修改为200,所以ia打印为200,然后返回main中继续执行输出语句,ib的值本身没被改变,所以打印仍为10.
画出栈为:
再来看这组代码:
public class demo01 {
/*自定义成员方法实现将参数传入的整数修改后打印的功能*/
void setArr(int[] arr1){
arr1[0] = 200;
System.out.println("arr1[0]= " + arr1[0]);//arr1[0]=?
}
public static void main(String[] args) {
demo01 demo01 = new demo01();
int[] arr2 = new int[]{10,20};
demo01.setArr(arr2);
System.out.println("arr2[0]= " + arr2);//arr2[0]=?
}
}
结果是: arr1[0]=200; arr2[0]=200;
这二者区别为:基本数据类型里存放的就是值,变量将值复制了一份传给了ia,而引用型数据类型里存放的是地址,相当于是把地址复制了一份给你,最后ia.ib都指向了同一个地址,画出栈区如下:
那么,我们再来修改一下,新增一行代码,结果又如何呢?
public class demo01 {
/*自定义成员方法实现将参数传入的整数修改后打印的功能*/
void setArr(int[] arr1){
arr1 = new int[2];//加上该行代码后结果如何?
arr1[0] = 200;
System.out.println("arr1[0]= " + arr1[0]);//arr1[0]=?
}
public static void main(String[] args) {
demo01 demo01 = new demo01();
int[] arr2 = new int[]{10,20};
demo01.setArr(arr2);
System.out.println("arr2[0]= " + arr2);//arr2[0]=?
}
}
结果为: arr1[0]=200; arr2[0]=10;
原理为:arr1 = new int[2];这行代码有new了一个新的内存地址,所以