结论测试
一、基本类型做为参数传递时,是传递值的拷贝,不管你怎么改变这个拷贝,原值是不会改变的this
二、对象做为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。spa
经过上面的两段程序能够得出以下结论:code
l 当调用方法时,若是传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响对象
l 当调用方法时,若是传入的数值为引用数据类型(String类型除外),形式参数的改变对实际参数有影响blog
类:内存
1 class Car 2 { 3 //属性 4 String pinpai; 5 String type; 6 double pailiang; 7 }
测试:class
1 class TestCar 2 { 3 public static void main(String[] args) 4 { 5 Car car=new Car(); 6 car.pinpai="牧马人"; 7 car.pailiang=800; 8 car.type="7座"; 9 System.out.println("车的品牌为"+car.pinpai); 10 System.out.println("车的排量为"+car.pailiang); 11 System.out.println("车的类型为"+car.type); 12 } 13 }
结果:变量
基本类型的参数传递:数据类型
1 1 public class ParamTransfer { 2 2 public int money; 3 3 4 4 public void amethod(int i) { 5 5 System.out.println("方法获得的i的值:" + i); 6 6 i = i * 5; 7 7 System.out.println("方法执行语句i=i*5后i的值:" + i); 8 8 System.out.println("money的值:" + this.money); 9 9 } 10 10 11 11 public static void main(String[] args) { 12 12 ParamTransfer pt = new ParamTransfer(); 13 13 pt.money = 100; 14 14 pt.amethod(pt.money); 15 15 } 16 16 17 17 }
1 运行结果以下: 2 方法获得的i的值:100 3 方法执行语句i=i*5后i的值:500 4 money的值:100
注意对比形参i和money值的变化。这里咱们把pt.money做为参数传递给amethod方法,该方法中i获得的值是100,这个咱们从运行结果中可知。执行完i=i*5语句后咱们发现当前对象的money属性值并无发生改变,这就说明这里只是传了一个100数值给形参i,至关于把pt.money的值拷贝给i,i的变化并不会影响pt.money的值,仅仅是传数值。
2.引用类型的参数传递
1 1 class Time { 2 2 public int hour; 3 3 public int minute; 4 4 public int second; 5 5 } 6 6 7 7 public class ObjectParamTransfer { 8 8 Time time; 9 9 10 10 public static void main(String[] args) { 11 11 ObjectParamTransfer opt = new ObjectParamTransfer(); 12 12 opt.time = new Time(); 13 13 opt.time.hour = 11; 14 14 opt.time.minute = 22; 15 15 opt.time.second = 33; 16 16 17 17 System.out.println("time的属性值:"); 18 18 System.out.println("hour=" + opt.time.hour); 19 19 System.out.println("minute=" + opt.time.minute); 20 20 System.out.println("second=" + opt.time.second); 21 21 22 22 opt.method(opt.time);//将对象引用做为参数传递给方法method 23 23 //对比执行方法后的变化 24 24 System.out.println("执行方法后的time的属性值"); 25 25 System.out.println("hour=" + opt.time.hour); 26 26 System.out.println("minute=" + opt.time.minute); 27 27 System.out.println("second=" + opt.time.second); 28 28 29 29 } 30 30 31 31 private void method(Time t) { 32 32 System.out.println("参数t的属性值:"); 33 33 System.out.println("hour=" + t.hour); 34 34 System.out.println("minute=" + t.minute); 35 35 System.out.println("second=" + t.second); 36 36 System.out.println("对t和time进行==比较,结果为:" + (t == this.time)); 37 37 38 38 System.out.println("改变t的实例变量值"); 39 39 t.hour = 44; 40 40 t.minute = 55; 41 41 t.second = 60; 42 42 } 43 43 }
1 运行结果以下: 2 time的属性值: 3 hour=11 4 minute=22 5 second=33 6 参数t的属性值: 7 hour=11 8 minute=22 9 second=33 10 对t和time进行==比较,结果为:true 11 改变t的实例变量值 12 执行方法后的time的属性值: 13 hour=44 14 minute=55 15 second=60