java参数传递的探索

mac2022-06-30  82

前阵子手上有一个需求涉及到java传值的问题,我当时是想将一个定义好的String类型的变量作为参数传进一个方法中的,在方法中修改其值,接着在出方法以后做一个判断,判断这个值是否变化,有了变化就做一下操作,代码大概是这样的:

String version = "ABC"; hasOrderDetail(version); if(version.contains("XX")){ ..... } public void hasOrderDetail(String value){ value = "XXABC"; }

很快我就发现问题了,hasOrderDetail这个方法并没有修改String的值,这是为什么呢?

一:搞清楚引用类型

由上图可以见:

int是基本类型,值就直接保存在变量中

version是引用类型,所以它保存的是实际字符串的地址

 

 

二:搞清楚赋值运算符(=)的作用

 

num = 10

 

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉

 

version = "java";

对于引用类型,赋值运算符会改变其中保存的地址,地址值由原来的0x12变成了0x13,但是原地址中的值并不会改变,换句话说就是0x12中的值还是"hello"。

 

 

三:调用方法时发生了什么?

参数传递基本上就是赋值操作

1. 基本类型

  

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉

 

2. 引用类型

 

 

上图可以看到当进行参数传递的时候,相当于是将version中的地址值赋值给参数value,所以value此时指向的是0x12。 在函数中对value操作以后,value中的地址值就改变了

不难发现,最后只是value的值改变了,version的值并没有变化。

 

四:值传递or引用传递?

在确定值传递还是引用传递之前,我们来看下程序语言中是如何定义和区分值传递和引用传递的:

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数

 1.基本类型

public static void main(String[] args){ int num = 10; change(num); //num是实参 System.out.println(num); //10,对于形参的改变并没有影响实参 } public static void change(int number){ //number是形参 number = 20; System.out.println(num); //20 }

 

2.引用类型

public static void main(String[] args){ User user = new User(); user.setName("nianyuyu"); user.setAge(18); change(user); //user是实参 System.out.println(user); //{name="nianyuyu",age-18},对于形参的改变,没有影响实参 } public static void change(User u){ //u是形参 u = new User(); u.setName("java"); u.setAge(20); System.out.println(u); //{name="java",age-20} }

由上述代码可以看出java是一个值传递,在函数中如果对参数进行修改,将不会影响到实际参数。

 

 

总结:

1.引用类型保存的是这个值的地址,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变。

2.基本类型保存的是值,赋值运算符会直接改变变量的值,原来的值被覆盖掉。

3.参数传递基本上就是赋值操作,java是值传递。

 

转载于:https://www.cnblogs.com/nianyuyu/p/10888637.html

最新回复(0)