方法传参

当对象被作为一个参数被一个方法调用时,这里到底是值传递还是引用传递?

答:在JAVA程序语言中,只有值传递参数。而且在方法外这个值都是不受方法影响的。

无论是基本类型作为参数传递,还是对象作为参数传递,实际上传递的都是值,只是值的的形式不用而已。

基本数据类型作为参数传递,传递的是值的副本

引用数据类型作为参数传递,传递的是引用的副本 (引用中放的是对象的地址,在方法进行完毕后,地址还是不变的,只是地址对应的对象可能发生了改变)


Student s=new Student();

在栈中为s开辟空间,存放Student的地址

当被方法 public void change(Student s){   }调用时

在栈中为s开辟空间(这里的s为区间变量,不等于上面的s,这里的s可以是随便取名,a,b等,只代表方法传入参数的一个对象),当方法执行完毕后,系统会清理方法所开辟的栈的空间。


当参数的是基本数据类型时,传入的是值得拷贝,不管方法内部怎么改变,方法外的值是不变的。

  1. //在函数中传递基本数据类型,  
  2. public class Test {  
  3.            
  4.     public static void change(int i, int j) {  
  5.         int temp = i;  
  6.         i = j;  
  7.         j = temp;  
  8.     }  
  9.   
  10.     public static void main(String[] args) {  
  11.         int a = 3;  
  12.         int b = 4;  
  13.         change(a, b);  
  14.   
  15.         System.out.println("a=" + a);  
  16.         System.out.println("b=" + b);  
  17.     }  
  18. }  
  19.   
  20. 结果为:  
  21. a=3  
  22. b=4  
  23. 原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身;  

当参数的是引用数据类型时,传入的是地址得拷贝,当方法对这个地址进行操作时,也会对地址对应的对象进行修改,所以方法外的引用数据类型也会发生改变。

  1. //传的是引用数据类型  
  2. public class Test {  
  3.   
  4.     public static void change(int[] counts) {  
  5.         counts[0] = 6;  
  6.         System.out.println(counts[0]);  
  7.     }  
  8.   
  9.     public static void main(String[] args) {  
  10.         int[] count = { 12345 };  
  11.         change(count);  
  12.     }  
  13. }  
  14.   
  15. 在方法中 传递引用数据类型int数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。  

  1. //对象的引用(不是引用的副本)是永远不会改变的  
  2. class A {  
  3.     int i = 0;  
  4. }  
  5.   
  6.   
  7. public class Test {  
  8.   
  9.     public static void add(A a) {  
  10.         a = new A();  
  11.         a.i++;  
  12.     }  
  13.       
  14.     public static void main(String args[]) {  
  15.         A a = new A();  
  16.         add(a);  
  17.         System.out.println(a.i);  
  18.     }  
  19. }  
  20.   
  21. 输出结果是0  
  22. 在该程序中,对象的引用指向的是A ,而在change方法中,传递的引用的一份副本则指向了一个新的OBJECT,并对其进行操作。  
  23. 而原来的A对象并没有发生任何变化。 引用指向的是还是原来的A对象。

String为引用类型,但有final修饰,所以在传值时可看做是基本数据类型。














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值