java什么是值传递和引用传递,Java中值传递和引用传递有什么区别

1,Java中值传递和引用传递有什么区别基本类型是值传递,short、int、long、float、double、boolean、char 。复制复制 。内存中分配2份数据 。类类型是引用传递 。2个引用都指向内存的一份相同数据 。
2,Java中什么是值传递和引用传递对象被值传递 , 意味着传递了对象的一个副本 。因此,就算是改变了对象副本,也不会影响源对象的值 。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用 。因此,外部对引用对象所做的改变会反映到所有的对象上 。看你数据的类型,string类型就是假引用传递其他都是按假值传递 。你学java应该学过基本数据类型 和引用数据类型的概念这些传递有可能对原来的数据修改 , 并非真正的引用传递 。如果你学c#就知道里面有真正的引用传递
3,java中的值传递和引用传递的区别值传递和引用传递是c中的概念 , 在java中可以用于方便理解,但是java中是值传递的 。说说区别吧,昨天刚好看见这个问题 。8个基本数据类型是值传递,即方法内对其修改是不会改变实参的 , 其他引用类型(除了string)可以理解为引用传递,传进方法内部的是一个地址,可以理解为房子的钥匙 , 你有了钥匙,照样可以对房子进行改变,是吧 。那为什么string不行呢?因为string是不可改变的,虽然它也是传了地址,但已经是第二个引用(b)了  , 当你对形参进行改变,这时候b会指向新的string对象 。这时候原来的引用a是没有改变的,还是指向第一个对象 。不懂可以追问,共同学习值传递:(形式参数类型是基本数据类型):方法调用时 , 实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值 。引用传递:(形式参数类型是引用数据类型参数):也称为传地址 。方法调用时 , 实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中 , 对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数 。【java什么是值传递和引用传递,Java中值传递和引用传递有什么区别】
4,java 值传递 引用传递值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值 。引用传递:(形式参数类型是引用数据类型参数):也称为传地址 。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作 , 这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数 。这是个关于栈内存和堆内存的问题List list = new ArrayList(); 这句执行完以后实际在栈内存中产生一个list变量,在堆内存中产生一个ArrayList的对象,list变量的值实际上是堆内存Arraylist的地址 , Java中虽然没有指针的概念,这个叫引用 , 为了便于理解也可以想象成list指向ArrayList在程序执行了test2(list);之后,实际上在栈内存中又产生了一个新的变量,该变量是传入参数list的复制,这时候你可以理解成在栈内存中存在两个变量,一个是main方法中定义的list变量,一个是test2方法中定义的list变量的复制,两个变量都指向堆内存中存在的ArrayList对象,然后在tese2()方法中你执行 list=null;实际上只是改变了在test2中生成的list变量复制的值,list变量的值实际上并没有发生改变 , 这样解释不知道对你有没有帮助,祝成功^_^你应该将list 设为一个函数内的全局变量,把List list = new ArrayList(); 这句放在main 前面 试试 。。。if(list == null) 中list != null体会一下!你不是在list3()时把list赋值成a了吗?那怎么会为null呢?因为java中没有指针 , 所以我们说java是值传递 。因为c中,地址传递是通过指针的方式来实现的 。5,java中的值传递和引用传递到底有什么区别java中在参数传递时有2种方式,两者的区别:1、按值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改 , 将不会影响到实际参数 。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在传递时如果数据量非常大的话,运行效率自然就变低了,所以java在传递数据量很小的数据是值传递,比如java中的各种基本类型:int,float,double,boolean等类型的,具体可以自己测试 。结果:2、按引用传递:引用传递其实就弥补了上面说的不足 , 如果每次传参数的时候都复制一份的话,如果这个参数占用的内存空间太大的话,运行效率会很底下,所以引用传递就是直接把内存地址传过去,也就是说引用传递时,操作的其实都是源数据 , 这样的话修改有时候会冲突,记得用逻辑弥补下就好了 , 具体的数据类型就比较多了,比如Object,二维数组 , List , Map等除了基本类型的参数都是引用传递 。代码:有些文章中写的是java中所有的传参方式都是按值传递,这也说得通,无非就是文字游戏,因为无论是按值传递还是按引用传递都是把值传递过去了 , 所以就叫按值传递 。首先java 都是值传递的,也就是传递值的拷贝 , 一个副本 。1.引用型数据类型(一个栈内存空间只能对应一个堆内存空间,一个堆内存空间可以由多个栈内存指向 。)栈内存堆内存C→ED 引用类型,传值,传的是地址的拷贝 。如C地址指向堆E,拷贝C地址得到新的栈D 。D也指向堆E,所以D指向内容改变也就是C指向内容改变 。(因为没有新的new开辟新的堆内存空间,堆内存始终只是那一个D)2.基本数据类型,赋值操作时直接开辟一个空间并存储,无需new开辟 。A空间(存储数据a=1)B空间(存储数据b=a的拷贝)A和B是两个内存空间,B的内容改变不会影响A空间的内容 。个人理解初学者值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值 。引用传递:也称为传地址 。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中 , 对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值 。JAVA中没有引用传递都是值传递,网上讲的好多都是错误的,希望发帖都以后思考后再发:在 Java 应用程序中永远不会传递对象,而只传递对象引用 。因此是按引用传递对象 。但重要的是要区分参数是如何传递的 , 这才是该节选的意图 。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数 。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的 。Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型 。当作为参数传递给一个方法时 , 处理这两种类型的方式是相同的 。两种类型都是按值传递的;没有一种按引用传递 。按 值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 。因此,如果函数修改了该参数 , 仅改变副本,而原始值保持不变 。按引用传递意味 着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本 。因此,如果函数修改了该参数,调用代码中的原始值也随之改变 。当传递给函数的参数不是引用时,传递的都是该值的一个副本(按值传递) 。区别在于引用 。在 C++ 中当传递给函数的参数是引用时,您传递的就是这个引用,或者内存地址(按引用传递) 。在 Java 应用程序中 , 当对象引用是传递给方法的一个参数时,您传递的是该引用的一个副本(按值传递),而不是引用本身 。Java 应用程序按值传递所有参数,这样就制作所有参数的副本,而不管它们的类型 。值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值 。引用传递:(形式参数类型是引用数据类型参数):也称为传地址 。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作 , 这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数 。java中只有值传递!

    推荐阅读