当前位置:   article > 正文

Java参数传递传值还是传引用以及全局变量的使用问题_java通过形参传入的对象,赋值给一个全局的对象,当全局的对象销毁时,传入的形参会

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 // 但是,把形参指向别人,不影响原来传递的引用内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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

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

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/541338
推荐阅读
相关标签
  

闽ICP备14008679号