Java参数传递是通过值传递

Java参数传递是通过值传递,也就是拷贝传递。Java有两种变量,一种是值变量,一种是引用变量。

先看看值变量情况:

int x = 0x111;

void go(int z)

{

   z=0;

}

go(x);

println("x=", x);

打印结果x=7  (0x111). x被传入方法go后,只是把它的值拷贝后赋给了z变量。z变量的任何变化,不会改变原来x的值。

Java里面没有c语言一样的地址指针,这也是Java安全的基础,更是Java垃圾回收或者说内存自动管理的关键。


在看看引用变量作为参数被传入函数的情况:

引用变量可以理解为一个指针,它指向在堆上的对象实例。当引用变量被作为参数传入函数,实际上是传入了堆上对象实例的地址,对于这个对象所有操作均发生在堆上。所有结果是参数(对象的引用)未发生变化,但是参数(对象的引用)指向的对象实例,可能会被改变。

  1. public class Test{
  2.     
  3.     String str = new String("good");
  4.     char[] ch = {'a','b','c'};
  5.     int i = 10;
  6.     String[] ss1 = {"aaa"};
  7.     public void change(String str,char[] ch,int i, String[] s){
  8.         i++; 
  9.         str = "test ok";
  10.         ch[0] = 'g';
  11.         s[0] = "bbb";   
  12.     }
  13.     
  14.     public static void main(String[] args){
  15.     
  16.         Test tt = new Test();
  17.         tt.change(tt.str,tt.ch,tt.i);
  18.         System.out.println(tt.i);
  19.         System.out.print(tt.str);
  20.         System.out.println(tt.ch);  
  21.         System.out.println(tt.s);     
  22.     }
  23. } //以上程序来源于网络
  输出结果为

10     //  参数是值变量,通过值传递后被拷贝了一份,所以原来的值不会被修改

good  // String是一个对象,但是它比较特殊,详细解释见本文最后一段话。来自于http://blog.youkuaiyun.com/sujiacheng_123/article/details/53392830

gcb //  参数是数组,数组名其实是一个引用,引用被拷贝后还是指向同样的数据对象,所以对象的值被改变

bbb  //  参数是String的数组,原因同上

因为在Java里,String是对象类型,作为参数肯定是引用传递。之所以有值传递的效果,是因为Stirng内部实现时,是用char[] 来存储字符串的,所以String相当于char[]的包装类,那Java中,包装类的一个特质就是值操作时体现对应的基本类型的特质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值