Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?

来源:互联网 发布:程序和软件区别 编辑:程序博客网 时间:2024/05/16 04:33
public class main {

    private static void updateCustomer(Customer customer) {
        System.out.println("update before: " + customer.getName());
        customer.setName("abc");
        System.out.println("update after: " + customer.getName());
    }

    private static void updateCustomer2(Customer customer) {
        System.out.println("update before: " + customer.getName());
        
        customer = new Customer();
        customer.setName("abc");
        
        System.out.println("update after: " + customer.getName());
    }

    public static void main(String[] args) {

        Customer customer = new Customer();
        customer.setName("1");
        
//        updateCustomer(customer);
//        System.out.println("result1: " + customer.getName());

        updateCustomer2(customer);
        System.out.println("result2: " + customer.getName());

    }

}


注释 updateCustomer  和 updateCustomer2 的任一个方法。。不要同时都运行, 一次运行一个 。看两个方法下来的结果。。。。

跑updateCustomer , 结果:

update before: 1
update after: abc
result1: abc

(这个很好理解, 对象的引用地址传递)

跑updateCustomer  2   , 结果:

update before: 1
update after: abc
result2: 1

(为什么这个最后结果为1 啊,  难道说, 方法里 new了一个新的, 就不会影响之前的对象了。。。 那customer 这个变量 不是一个地址引用吗?
既然在updateCustomer  2里,它指向了一个新对象。。 为什么外面的 customer 还是指向以前的 地址引用。。。 这两个customer 到底是 同一个变量, 还是不同的变量呢??)

我的疑惑如下:

在main 方法里。。。有如下代码。。

    public static void main(String[] args) {

    Customer customer = new Customer();   // 这里, customer 指向一个 新对象的 地址。。。 customer变量 只是一个指向一个地址的引用。。
    customer.setName("1");

     updateCustomer2(customer); // 关键的地方来了,  customer 作为变量, 传进方法updateCustomer2里。。具体代码如下:


  private static void updateCustomer2(Customer customer) {  // 这里, customer 指向以前的对象的地址。。。
        System.out.println("update before: " + customer.getName());
        
        customer = new Customer();     //  这里 customer 指向了一个 新对象的 地址。。
        customer.setName("abc");
        
        System.out.println("update after: " + customer.getName());
    }


//跳出来,还是回到 main 方法里。。。

 System.out.println("result2: " + customer.getName());   //  这里,  customer,  到底是  指向以前对象呢,还是 新对象呢?? 我迷惑了。。。









原创粉丝点击