java参数传递

来源:互联网 发布:如何用王家卫 知乎 编辑:程序博客网 时间:2024/05/16 15:56

一直以来对java的参数传递总是一知半解的,今天打算彻底阐述一下。

值传递和引用传递

值传递:传递的就是参数值的拷贝。首先传递的事参数的值,其次是拷贝。改变传递后的值,原来的值是不会改变的。
引用传递:传递的是参数的地址(可以理解c语言中指针)。改变传递来的值,会引发原来的值改变

c语言中这个东西很好理解,如果传递的事值就是值传递,如果传的是引用的话就是引用(地址,指针等等)传递,但是java中就会出现问题,因为java没有引用,没有指针,难道就没有引用传递了?对还真没有引用传递,都是值传递。只不过 java传递对象时传递的是对象的句柄(在栈上的值,这个值存的是堆上对象的地址),所以也是一种值传递,到底是拷贝后的栈上的句柄还是直接传的句柄,就不清楚了,我倾向于和java那种传递拷贝后的值,但可以肯定的是传递的值,是值传递。

Test t = new Test()

这里的这个new语句,t在栈上分配的内存,new关键字表示在堆上分配内存。我们一般传递的就是t,这是一个在栈上的值,所以Java传递句柄t就是值传递

java 所有的传递都是值传递 传递的是 栈上的 值的拷贝

下面将讲述Java常见的3种传递,基础类型传递,引用类型传递

基础类型传递

int a = 12;public int fun(a){    return ++a;}sysout("--a--"+a);

这里的a 输出的值还是12

基础类型的内存分配是在栈上分配的,传递的是在栈上的值的拷贝,所以是值传递,不会影响原来的值

引用类型传递

 @Test      public void testChangeValue() {          TestBean bean = new TestBean();          bean.setFistname("tang");          bean.setLastname("chuan");          System.out.println("before change value---->"+bean);          changeValue(bean);          System.out.println("after change value----->"+bean);          TestBean u2 = new TestBean();              u2.setFistname("Lily");              u2.setLastname("Green");              System.out.println("Before change ref,user2 is :" + u2.toString());              changeRef(u2);              System.out.println("After change ref,user2 is :" + u2.toString());        }        public  void changeRef(TestBean u) {              TestBean u2 = new TestBean();              u2.setFistname("tang");              u2.setLastname("chuan");              u = u2;          }          public  void changeValue(TestBean u) {              u.setLastname("White");          }  

应用类型传递 传递的是 栈上存储 的句柄的拷贝,是没办法改变这个句柄的值,但是可以通过这个句柄 去改变句柄指向的堆上的内存的值。

总的来说一般写代码加上返回值,总是好的,总是没有问题的。