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

java传俩个参数用什么注解 java传参是引用还是值_java

进入initBean,还没有进行new 操作时方法参数中user是null

java传俩个参数用什么注解 java传参是引用还是值_java_02

进行new 操作创建对象,参数的user就给分配了一个对象地址

java传俩个参数用什么注解 java传参是引用还是值_User_03

当执行完initBean之后,main方法中的user 任然为 null

java传俩个参数用什么注解 java传参是引用还是值_User_04

上面是看的引用对象,下面我们再看下基本数据类型作为参数传递是怎么样的,看下面这个简单的例子,我们通过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,

java传俩个参数用什么注解 java传参是引用还是值_java传俩个参数用什么注解_05

进入change,在执行修改之前参数arg1,和arg2的值也都是0,

java传俩个参数用什么注解 java传参是引用还是值_User_06

进行修改操作之后arg1 = 2,arg2 = 5;

java传俩个参数用什么注解 java传参是引用还是值_Test_07

执行完change之后,x,y仍然是0,感觉这里结果一样的。

java传俩个参数用什么注解 java传参是引用还是值_User_08

方法的参数传递到底值怎么传递的呢。
在java中方法的参数传递实际是值的传递。但并不是将变量值进行传递,而是复制一个副本进行值的传递。当我们传递的是基本数据类型时,复制的是基本数据类型在栈中的字面值进行传递。如果传递的是对象参数,复制的不是对象本身的值,而是存储在栈中对象引用地址字面值进行传递。
 1、基本数据类型传递的实际情况

java传俩个参数用什么注解 java传参是引用还是值_java_09

2、引用数据类型传递实际情况

java传俩个参数用什么注解 java传参是引用还是值_java传俩个参数用什么注解_10


java传俩个参数用什么注解 java传参是引用还是值_User_11


java传俩个参数用什么注解 java传参是引用还是值_User_12

总结:java中方法值的传递不管是基本类型还是引用对象都是值的传递,一个传的是字面值一个传递的是引用地址值,传递的值都是副本形式传递。