如何区分Java中值传递和引用传递的区别?这可能是Java初学者必定会遇到的问题。其实学编程的朋友不论是学哪一种面向对象的语言的时候都会遇到这样的知识点。参数的传递是常见的一种现象,那么方法在执行形式参数的过程中是否影响实际参数的值成为了两种传递最重要的区别。
首先来了解值传递的概念:在值传递过程中,形式参数类型是基本数据类型,当用方法调用时,实际参数将它的值传递给相应的形式参数,而形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,因此在方法执行中形式参数值的改变不影响实际参数的值。
然后再来了解引用传递的概念:在引用传递中,形式参数类型是引用数据类型参数,或者叫做“传地址”。当方法调用时,实际参数对象(或数组)与形式参数指向同一个地址,执行方法的过程中,对形式参数的操作实际上就是对实际参数的操作,在方法结束后这一结果被保留下来,于是形式参数的改变将会影响实际参数的值。
在了解了值传递和引用传递的区别之后,那么在Java中通常是用哪种传递呢?在 Java 应用程序中通常不会传递对象,而是按照引用来传递对象。在这里有一个不容忽视的问题是参数如何传递的?Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而Java应用程序是按值传递对象引用的。
Java程序中的变量通常有两种可能:引用类型或基本类型。当某个参数传递给一个方法时,处理这两种类型的方式是相同的。尚学堂陈老师提到,两种类型均可以按值传递的,而不需要引用传递。按值传递意味着当将一个参数传递给一个函数(或方法)时,函数接收的是原始值的副本。因此,如果参数被函数修改,改变的只是副本,原值可以不变。若是按照引用传递,当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,若这一参数被函数所修改,调用代码中的原始值也随之变化。
在 C++ 中当传递给函数的参数是引用时,您传递的就是这个引用或者内存地址可按引用传递,而在Java中,当对象引用是传递给方法的一个参数时,您传递的是该引用是按照值传递进行的,并非引用本身。
例如判断java string是值传递还是引用传递,我们可以看到String是引用类型,但在Java的字符串常量池机制下,声明或连接字符串常量均需要用到字符串常量池。若常量池中有该字符串序列则返回,所以str创建了一个字符串并放入常量池中,str2内的字符序列已在常量池中,因此str2指向str的对象。
例子:
String str="scce"; //创建了一个对象
String str2="scce"; //指向一个对象,不是新建
str==str2返回true //同一个内存地址
String str2=new String("scce"); str==str2返回false //新建了一个对象,内存地址不一样!
所以答案肯定是false
如何区分Java中值传递和引用传递的区别?通过以上的讲解可以看出Java中通常是采用值传递的方式,所以这也是Java和其他语言的不同。
领取专属 10元无门槛券
私享最新 技术干货