Java中基本数据类型不存在引用类型,这点与C++中不同,在后者中可以方便地使用引用类型修改变量的值。Java中也没有指针,在Java中无法直接做到这点,原因可以参见
浅析Integer类型传参值不变来理解Java值传参_Eternal frustration的博客-CSDN博客
本文提出一种十分便捷的方法间接实现这一点——使用单元素数组。
首先看这个例子。
public class Test1 {
public static void plus1(Integer a) {
a++;
}
public static void main(String[] args) {
Integer a = 0;
System.out.println("a=" + a);
plus1(a);
System.out.println("a=" + a);
}
}
执行结果是打印的Integer a并不会发生变化。但是在编程时想要让a随着子函数调用发生变化,可以像下面这段代码这样实现:
public class Test2 {
public static void plus1(Integer[] a) {
a[0]++;
}
public static void main(String[] args) {
Integer[] a = {0};
System.out.println("a=" + a[0]);
plus1(a);
System.out.println("a=" + a[0]);
}
}
用单元素数组去容纳想要传递的引用类型变量,即可在子函数调用后保留变量发生的变化。这种方法对于基本数据类型、Integer类、String类均适用。
也许有人会质疑这样做的必要性是什么。这样做主要是为了对基本数据类型也间接实现引用,从而获得便利,这样就不用让调用的子函数去返回改变后的值,而是让单元素数组保留变量的变化。
可以再看一个例子,用Java实现求二叉树的高度。
class BTNode<ElemType> {
...
}
public class BTree<ElemType> {
...
public int getBTHeight() {
Integer[] finH = {0};//finH用来存储二叉树的高度
getBTHeight1(root, 1, finH);
return finH[0];
}
//递归体采用先序遍历
private void getBTHeight1(BTNode<ElemType> n, int curH, Integer[] finH) {
if (n == null) {
return;
}
if (curH > finH[0]) {//curH表示当前节点的高度
finH[0] = curH;
}
getBTHeight1(n.lchild, curH + 1, finH);
getBTHeight1(n.rchild, curH + 1, finH);
}
...
}
这里单元素数组finH就间接实现了引用类型,保留了递归方法调用时对其所作的变化。