Java参数传递传值还是传引用以及全局变量的使用问题

在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用?

先说结论,无论你传的是基本数据类型还是引用类型,都是值传递。(因为引用类型只不过是把指向对象的地址拷贝一份传递给形参)。

这样理解,引用类型的变量存储在栈中,其数值表示堆上对象的内存地址。调用函数时,会把这个变量的值(引用类型的话也就是对象地址)拷贝一份在栈上,传递给函数,此时在函数内重新给形参赋值并不会影响到外部的那个变量(实参)。而通过这个形参修改指向的对象时,因为形参与实参指向的是同一个对象,所以影响的是同一个对象。

比如方法A中把对象引用list(作为指针p1)传递给方法B,那么B中的方法栈里会复制一份list指向的地址(作为指针p2)。 p1和p2指向的内容一定是一样的,p2修改了对象内容,比如add了一个数,那么p1也可以访问到这个数。但是 如果在方法B里改变了指针p2指向的地址, p1是不受影响的,因为是两个方法栈。 (Java没有指针,上面用指针表示 只是为了更容易理解)

画个图:

在这里插入图片描述
看下面这个例子:

public class Main {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1); list.add(2);list.add(3); list.add(4);

        addList(list);
        for (int num : list) System.out.print(String.valueOf(num) + " ");
        System.out.println();
        
        changeList(list);
        for (int num : list) System.out.print(String.valueOf(num) + " ");

    }
    public  static  void addList(ArrayList<Integer> list) {
        list.add(5);
    }
    public  static  void changeList(ArrayList<Integer> list) {
        list = new ArrayList<>();
        list.add(6); list.add(7);
    }
}

输出:
1 2 3 4 5 // 可以使用形参修改
1 2 3 4 5 // 但是,把形参指向别人,不影响原来传递的引用内容

所以,之前刷题的时候,妄想通过传递方法参数,来实现全局变量的效果是失败的!

比如 剪纸offer里 二叉搜索树转换成双向链表的题,见题解。

因为方法返回之后,原来传递的是null,现在还是null.

其实,idea就有相关提示,可能你没有注意,你看这个例子。
在第一个方法里,当你add(修改)引用内容的时候,list下面没有提示
第二个方法里,当你改变了形参list指向内容时,它就给你整灰色了,还有下划线
在这里插入图片描述

补充:值传递和引用传递的结论:

(1)基本数据类型int,double等传值,对形参的修改不会影响实参

(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;如果形参指针指向别的对象,则不会对原有对象造成影响。

(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值