我的提问 我要提问

匿名发表 2018-10-30 00:04:30

[@倚贤][¥20]什么是值传递和引用传递?

Java核心技术

什么是值传递和引用传递?

回答(23)

萧雪升 0

值传递:通过复制传递
引用传递:实际就是通过指针常量实现的

huanglala 0

传值:和copy是一样的。【打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的房子做什么事都不会影响到我,我在我的房子里做什么事也不会影响到你,彼此独立。】
传引用:类似于C语言的指针了,感觉差不多。打个比方,我有一橦房子,我给你一把钥匙,我们二个都可以进入这个房子,你在房子做什么都会影响到我。

【优缺点:】传值会很耗时间,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作,传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!

灵魂可口 0

值传递就是把数值传过去,引用传递,实际是传递保存值的指针。

hujun123qwe 0

C/C++中区分值传递和指针传递。JAVA中只有值传递,没有引用传递一说,对对象本身看成一种值(地址值)也归为值传递。

游客d4cz7w7ooyjf2 0

1、值传递

    在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

2、引用传递

    引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

板报教育网https://m.banbaoedu.com/

开心不大好 0

我是这样理解的,值传递就是你需要数据的时候给你复印一份,你所有的修改操作都是在复印件上进行的,而主程序则用的是原件。引用传递则是把原件给你了,所有的修改都会影响以后主程序对原数据的使用。

天雷henry 0

按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本

双持 0

值传递:实参拷贝到形参
引用传递:形参是实参的一个引用

1193757313281206 0

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

笨鸟先飞wei 0

值传递,在堆内存是有值的,引用传递在只是用一个地址指向堆内存里面的数值

云上珠玑 0

用网游来比喻,值传递就是进竞技场,在里面不管怎么被虐,出来后依然满血;引用传递就是下副本,副本里面挂了就是真的挂了,要承受损失。

谢杨易 0

  1. 值传递,直接将内容复制过去,之后修改的话,原先的内容不会改变
  2. 引用传递:传递的是对象的引用,之后修改的话,原先的内容也会变

1805394968663721 0

1、得回忆下C语言


int value = 10;
int *pointer;
pointer = &value; // 指针poiner引用的value的地址


printf("value = %d, *pointer = %d \n", value, *pointer);
// 结果是: value = 10, *pointer = 10

value就是个值;
*pointer是个指针,其实就是一个引用;pointer = &value 后,pointer值就指向了 value的地址

2、再说说高级语言

简单来说,值传递就是把值类型拷贝一份,引用传递就是把指针(引用)拷贝一份。


Integer num = 10; // 基本概念: Integer是引用类型,int是值类型。
int value = num; // 值传递
Integer pointer = num; // 引用传递

再进一步的,高级语言中自定义类对象都是引用类型。


public class MyClass {
private int value;
// getter, setter ...
}

MyClass inst1 = new MyClass(); // 引用类型,存放在堆上
inst1.setValue(10);

MyClass inst2 = inst1; // 引用传递
int value = inst1.getValue(); // 值传递

像C#中的委托(一个函数的指针)也是引用类型,各种 = 赋值操作都是引用传递了。要想再深入理解,就去看看内存模型,像Java、C#都有“堆”和“栈”的概念,学习下值类型和引用类型在内存模型中的存放规则。

1700649009404218 0

值传递:函数参数对对象进行复制,在函数里修改值的字段,不会改变原来的内容;
引用传递:传递的是对象的引用(或者是指针),在函数内改变参数对象的字段值,会改变原来的对象;

1527468097561283 0

其实是要理解什么是引用和指针,所有变量都是一个指针,指向真是的存储地址,因此你如果只是修改指针指向,那么原始的值是不会改的。比如:

public class User {
int age;
}

@Test
public void test_count_3() {
    User u = new User();
    u.age = 10;
    System.out.println(u.age);
    changePoint(u);
    System.out.println(u.age);
    changeValue(u);
    System.out.println(u.age);

}

private void changePoint(User a) {
    a = new User();
    a.age = 12;
}

private void changeValue(User a) {
    a.age = 12;
}

可以看到输出分别是10、10、12

林创 0

说白了,地址传递进来的变量,在函数中修改后,函数外面也会改变。值传递不会改变。

1537445919627494 0

值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。 引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

xwaby 0

传值参数:普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。

引用形参直接关联到其所绑定的对象,而并非这些对象的副本。定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参完全以相同的方式工作。每次调用函数,引用形参被创建并与相应实参关联。

静静-nancy 0

理解这两者区别之前先理解这两种数据存储的方式:
1、值类型(也称基本类型):一般包含number,string,bool,undefined,是将数据直接存储在变量中
2、对象类型(也称引用类型):一般包含array,object,基本上能new的都是,此类型一般存储复杂数据,无法直接存储在变量中,而是在内存中单独划一块空间,将这个对象放在空间内,并将这块内存空间的地址给变量
所以:值传递可以直接将自己的值复制给另一变量或函数的参数,内存中就会有两个变量是同样的值;而引用传递,则是将自己的引用地址给对方,对方通过地址找到的是同一个对象

琥珀行者 0

1、值传递

    在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

2、引用传递

    引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

作者:Norte_L
来源:CSDN
原文:https://blog.csdn.net/Norte_L/article/details/80250057
版权声明:本文为博主原创文章,转载请附上博文链接!

相关问题