黑马程序员技术交流社区

标题: 引用传参和值传参的定义及区别 ??? [打印本页]

作者: 王海旺    时间: 2013-7-20 23:18
标题: 引用传参和值传参的定义及区别 ???
今天 重新温习了一下 老师讲得基础知识  学到这里 突然感觉到 “引用传参 与 值传参”这块 似懂非懂的感觉 ,希望求大神 帮忙讲解一下 最后详细些 或者 图解。。。谢谢

作者: a767175432    时间: 2013-7-20 23:47
首先你先明白 A a = new A();这种创建对象的过程
1.在栈内存中开辟 a 的空间
2.在堆内存开辟空间后使用new调用构造方法进行对象的初始化
3.返回对象的地址给a

例如
class A
{
int num = 50;
}

class B
{
//参数为引用,使用用引用a找到所在的地址传入
public void show(A a)
{
//访问传过来的地址中num的值
System.out.println(a.num);
}

//值传参,仅仅传过来一个整数值 如show(new A().num);
public void show(int num)
{
System.out.println(num);
}
}

楼主对比一下应该就知道了

作者: 郭俊    时间: 2013-7-21 00:06
本帖最后由 郭俊 于 2013-7-21 00:29 编辑
  1. package it.ima.test;

  2. public class Demo{
  3.     public static void diandao(int[] a)
  4.     {   
  5.         int l = a.length;
  6.         int half = l/2;
  7.         int tmp;
  8.         for(int i=0;i<half;i++)
  9.         {
  10.             tmp = a;
  11.             a = a[l-i-1];
  12.             a[l-i-1] = tmp;
  13.         }
  14.     }
  15.     public static void main(String[] args) {
  16.         int [] a = {1,2,3,4,5,6,7,8,9};
  17.         diandao(a);
  18.         for(int i=0;i<a.length;i++){
  19.             System.out.print(a+" ");
  20.         }
  21.     }
  22. }
  23. <span style="background-color: rgb(0, 255, 255);">//传递的是个数组,属于引用传参。就是会把内存地址传过去。。在diandao函数里对数组做的任何修改,都会保存下来</span>
  24. class demo1 {
  25.     public static void main(String[] args){
  26.             String str ="11111";
  27.         System.err.println(str);  <span style="background-color: rgb(0, 255, 255);">//值传参,传递的是个String,虽然String是对象,但它比较特殊,只是把String里的值传了过去</span>
  28.     }
  29. }
复制代码

作者: chilong_333    时间: 2013-7-21 08:21
1. 我们都知道,普通的传值参数是由行参传给实参;

编译器在函数内部为每一个参数产生一个临时变量,将每一个参数压入栈(stack)中,将实参的数值保存到临时变量中。
所以才有在低端8位机中,对参数的数量有比较严格的限制,因为栈的深度非常有限;当然,在通用机上也有同样的问题,参数过多不合适,但通用机的栈的深度比低端机大多了;

2. 引用做参数传递的是变量的地址;

实质上传递的是变量的指针;
引用作为参数的好处是减少了临时变量对内存的开销,因此常用于对大对象的操作;
而常引用做参数就是保护参数不被修改;

作者: 赵太云    时间: 2013-7-21 09:01
   其实引用传递和值传递最终都是值传递的,只不过为了区分引用传递和值传递的值不一样,所以起了这两个名。
   引用传递:好比,C语言中的指针 ,在java中,引用传递是传的对象的hash值,比如调用一个方法:y(new Object());
   值传递:  好比,直接赋值,比如,   调用一个方法:
  1. zhi(34);
复制代码


    PS:如果是:  str("字符串");这个是属于引用传递,还有基本数据类型的包装类对象。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2