Java实现传递引用类型的基本数据类型、Integer、String等

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就间接实现了引用类型,保留了递归方法调用时对其所作的变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值