1. 基本数据类型是值传递
基本数据类型实例
public class TempTest { private void test1(int a){ num = 1; System.out.println("test1方法中的num="+num); } public static void main(String[] args) { TempTest t = new TempTest(); int num = 0; t.test1(num);//传递后,test1方法对变量值的改变不影响这里的a System.out.println(”main方法中的num=”+num); } }
运行结果是:
test1方法中的num=1 main方法中的num=0
我们先解释基本类型的传递:
虚拟机分配给num一个内存地址,并且存了一个值0.
虚拟机复制了一个num,我们叫他num’,num’和num的内存地址不同,但存的值都是0。
虚拟机讲num’传入方法,方法将num’的值改为1.
方法结束,方法外打印num的值,由于num内存中的值没有改变,还是0,所以打印是0.
2.引用数据类型是引用传递
引用数据类型实例
public class TempTest { private void test1(A a){ a.age = 20; System.out.println("test1方法中的age="+a.age); } public static void main(String[] args) { TempTest t = new TempTest(); A a = new A(); a.age = 10; t.test1(a); System.out.println(”main方法中的age=”+a.age); } } class A{ public int age = 0; }
运行结果如下:
test1方法中的age=20 main方法中的age=20
我们再解释封装类型的传递:
5.String是引用数据类型,那么String是值传递还是引用传递呢?
public class Test { public static void main(String[] args) { String str = "ab"; changeString(str); System.out.println("str="+str); } private static void changeString(String str) { str = "cd"; } }
我们实际运行一下看看:
str = ab;
这如何解释呢?难道String是基本类型?也说不通呀。
我们再来解释String在传递过程中的步骤:
虚拟机在堆中开辟一块内存String,并存值”ab”。
虚拟机在栈中分配给str一个内存,内存中存的是String中的地址。
虚拟机复制一份str,我们叫str’,str和str’内存不同,但存的值都是String的地址。
将str’传入方法体
方法体在堆中开辟一块内存String`,并存值”cd”
方法体将str’的值改变,存入String`的内存地址
方法结束,方法外打印str,由于str存的是String的地址,所有打印结果是”ab”