Java值传递和引用传递

DFS所遇BUG

进行一个DFS时,遇到了进行参数传递时直接传了ArrayList类型(C++习惯),但是发现DFS中所有ArrayList都指向了一个,看测试代码:

import org.omg.PortableInterceptor.INACTIVE;

import java.util.ArrayList;
import java.util.Vector;

/**
 * @Author Yuri
 * @Date 2020/11/26 13:51
 * @Version 1.0
 * @Description:
 */
public class Test {
    static Integer n = 0;

    public static void dfs(int k, ArrayList<Integer> arrayList) {

        arrayList.add(k);
//        ArrayList<Integer> arrayList = new ArrayList<Integer>(al);
//        arrayList.add(k);
        if (k == 5) return;
        System.out.println(++n + ": " + arrayList);
        for (int i = 0; i < 3; i++) {
            dfs(k + 1, arrayList);
        }
    }

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        dfs(1, new Ar
            rayList<Integer>());
    }
}

输出结果:

QQ截图20201126180533

总结原因是没搞清Java的值传递和引用传递。

Java值传递和引用传递

定义

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。
指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。(C++)

Java各类型的传递规则

boolean byte char short Int long float double
Boolean Byte Character Short Integer Long Float Double
  • 八大基本类型都是值传递
  • 需要new的(ArrayList、Vector...)都是引用传递
  • String、包装类型虽然是引用传递,但是效果是值传递。
posted @ 2020-11-26 18:25  AkimotoAkira  阅读(130)  评论(0编辑  收藏  举报