结论一:基本数据类型传递的是值(值的拷贝),形参的任何改变不影响实参
例如:源代码
public class HI{ public static void main(String[] args) { int a=10; int b=20; AA c=new AA(); c.exchange(a,b); //实参基本数据类型a和b的值10和20分别拷贝给形参 System.out.println("main方法中的值a="+a+" b="+b); //输出a=10,b=20. } } class AA{ public void exchange(int a,int b){ //接收到实参拷贝的a和b的值 int tmp=a; a=b; b=tmp; //形参中a,b值的改变不影响实参中a和b的值的改变 System.out.println("交换后的值a="+a+" b="+b); //输出a=20,b=10 } }
结论二:引用数据类型传递的是地址(传递的也是值,但是这个值是地址),可以通过改变存放在堆内存中的数据类型进而根本性的影响到实参的值(因为这时实参和形参的数据类型引用的都是堆内存中的数据值),可以通过形参影响实参。
例如:源代码
public class HI{ public static void main(String[] args){ person p=new person(); //堆内存创建一个person对象,栈内存有对象引用p存放person对象的地址。 B b=new B(); //堆内存创建一个B对象,栈内存存有对象引用b存放指向B的地址 p.age=10; //栈内存的p通过地址找到堆内存中的person对象初始化它的age值 p.name="小明"; b.c(p); //将main方法中的p实参指向堆内存person的地址传给B类的c方法中 System.out.println("小明的年龄age="+age); } } class person{ String name; int age; } class B{ public void c(person p){ //接收到指向堆内存person对象的地址 p.age=100; //通过地址找到person对象中的age修改其值为100 } }
public class HI{ public static void main(String[] args){ Person p=new Person(); //在堆内存创建一个Person类的对象p1(p1是对这个对象的称呼) p.age=10; //将p1对象中的age基本数据类型改为10 p.name="tom"; //将p1对象中指向方法区中的常量池中的name引用变量改为tom A c=new A(); //在堆内存中创建一个A类的对象c1 c.a(p); //将p对象的地址实参传给A类的a方法接收 System.out.println(p.age); //输出p1对象的age的值 } } class Person{ String name; int age; } class A{ public void a(Person p) //接收Person类的p对象地址 { p=new Person(); //在堆内存中创建一个Person类的p2对象(注意这里的p2对象不是p1对象,但是他们都是Person类) p.age=100; //将p2对象的age改为100(p1对象的age还是10不变) p.name="Jack"; //将p2对象的name改为Jack(p1对象的name还是tom没变) } }