java 方法传参是引用传递还是值传递
在开始之前先看个简单的例子,将一个对象通过方法传递,然后在方法体内又进行了new操作来创建类,在方法执行完之后再对对象进行操作,如下这个示列
创建一个对象 User
public class User {
private String name;
private Integer age;
private String telNo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getTelNo() {
return telNo;
}
public void setTelNo(String telNo) {
this.telNo = telNo;
}
}
创建一个测试类 Test ,在Test类写一个initBean 方法来实例User 对象,
public class Test {
public static void main(String[] args) {
User user = null;
initBean(user);
System.out.println(user.getName());
}
private static void initBean(User user){
if (user == null){
user = new User();
}
user.setName("张三");
user.setAge(28);
user.setTelNo("18695486987");
}
}
执行main方法来看下结果,结果报了NullPointerException异常。
Exception in thread "main" java.lang.NullPointerException
at hx.data.mybatis.aop.Test.main(Test.java:12),
这里明明已经实例化这个对象了为什么还会报错呢,下面我们打个断点跟进去看下
在initBean方法之前,user = null
进入initBean,还没有进行new 操作时方法参数中user是null
进行new 操作创建对象,参数的user就给分配了一个对象地址
当执行完initBean之后,main方法中的user 任然为 null
上面是看的引用对象,下面我们再看下基本数据类型作为参数传递是怎么样的,看下面这个简单的例子,我们通过change方法将x,y传递进去,然后进行修改,最后打印出x,y的值,看是否发生变化。
public static void main(String[] args) {
int x = 0;
int y = 0;
change(x,y);
System.out.println("X = "+x+" Y = "+y);
}
private static void change(int arg1,int arg2){
arg1 = arg1+2;
arg2 = arg2+5;
}
执行结果是 X = 0 Y = 0,这会不会是跟上面的情况一样呢,下面我们还是断点进去看下
执行change之前x,y的值为0,
进入change,在执行修改之前参数arg1,和arg2的值也都是0,
进行修改操作之后arg1 = 2,arg2 = 5;
执行完change之后,x,y仍然是0,感觉这里结果一样的。
方法的参数传递到底值怎么传递的呢。
在java中方法的参数传递实际是值的传递。但并不是将变量值进行传递,而是复制一个副本进行值的传递。当我们传递的是基本数据类型时,复制的是基本数据类型在栈中的字面值进行传递。如果传递的是对象参数,复制的不是对象本身的值,而是存储在栈中对象引用地址字面值进行传递。
1、基本数据类型传递的实际情况
2、引用数据类型传递实际情况
总结:java中方法值的传递不管是基本类型还是引用对象都是值的传递,一个传的是字面值一个传递的是引用地址值,传递的值都是副本形式传递。