黑马程序员技术交流社区
标题:
引用传参和值传参的定义及区别 ???
[打印本页]
作者:
王海旺
时间:
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 编辑
package it.ima.test;
public class Demo{
public static void diandao(int[] a)
{
int l = a.length;
int half = l/2;
int tmp;
for(int i=0;i<half;i++)
{
tmp = a;
a = a[l-i-1];
a[l-i-1] = tmp;
}
}
public static void main(String[] args) {
int [] a = {1,2,3,4,5,6,7,8,9};
diandao(a);
for(int i=0;i<a.length;i++){
System.out.print(a+" ");
}
}
}
<span style="background-color: rgb(0, 255, 255);">//传递的是个数组,属于引用传参。就是会把内存地址传过去。。在diandao函数里对数组做的任何修改,都会保存下来</span>
class demo1 {
public static void main(String[] args){
String str ="11111";
System.err.println(str); <span style="background-color: rgb(0, 255, 255);">//值传参,传递的是个String,虽然String是对象,但它比较特殊,只是把String里的值传了过去</span>
}
}
复制代码
作者:
chilong_333
时间:
2013-7-21 08:21
1. 我们都知道,普通的传值参数是由行参传给实参;
编译器在函数内部为每一个参数产生一个临时变量,将每一个参数压入栈(stack)中,将实参的数值保存到临时变量中。
所以才有在低端8位机中,对参数的数量有比较严格的限制,因为栈的深度非常有限;当然,在通用机上也有同样的问题,参数过多不合适,但通用机的栈的深度比低端机大多了;
2. 引用做参数传递的是变量的地址;
实质上传递的是变量的指针;
引用作为参数的好处是减少了临时变量对内存的开销,因此常用于对大对象的操作;
而常引用做参数就是保护参数不被修改;
作者:
赵太云
时间:
2013-7-21 09:01
其实引用传递和值传递最终都是值传递的,只不过为了区分引用传递和值传递的值不一样,所以起了这两个名。
引用传递:好比,C语言中的指针 ,在java中,引用传递是传的对象的hash值,比如调用一个方法:y(new Object());
值传递: 好比,直接赋值,比如, 调用一个方法:
zhi(34);
复制代码
。
PS:如果是: str("字符串");这个是属于引用传递,还有基本数据类型的包装类对象。。。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2