首页 >Java >java教程 >如何在Java中实现基元的引用传递效果?

如何在Java中实现基元的引用传递效果?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-12 22:15:031010浏览

How Do You Achieve a Pass-by-Reference Effect for Primitives in Java?

Java 相当于原语按引用传递

在 C 中,按引用传递允许函数修改其范围之外的变量。然而,Java 是按值传递进行操作的,因此很难为基元实现相同的效果。

考虑以下代码:

public class XYZ {
    public static void main(String[] args) {
        int toyNumber = 5;
        XYZ temp = new XYZ();
        temp.play(toyNumber);
        System.out.println("Toy number in main " + toyNumber);
    }

    void play(int toyNumber) {
        System.out.println("Toy number in play " + toyNumber);
        toyNumber++;
        System.out.println("Toy number in play after increment " + toyNumber);
    }
}

此代码将导致:

Toy number in play 5
Toy number in play after increment 6
Toy number in main 5

与 C 不同,在 play() 中对 toyNumber 进行的更改不会影响其在 main() 中的值。这是因为 Java 通过复制而不是引用传递原始值。

替代方法

1。使用对象包装器:

一种方法是将基元包装在对象中并通过引用传递对象:

class ToyNumber {
    int toyNumber;
}
public static void main(String[] args) {
    ToyNumber toyNumber = new ToyNumber(5);
    XYZ temp = new XYZ();
    temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber.toyNumber);
}
void play(ToyNumber toyNumber) {
    System.out.println("Toy number in play " + toyNumber.toyNumber);
    toyNumber.toyNumber++;
    System.out.println("Toy number in play after increment " + toyNumber.toyNumber);
}

此方法允许play() 中所做的更改将反映在 main() 中。但是,它通过创建对象引入了额外的开销。

2.返回值:

另一个选项是返回修改后的值:

int play(int toyNumber) {
    ...
    return toyNumber;
}
public static void main(String[] args) {
    int toyNumber = 5;
    toyNumber = temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber);
}

此方法有效,但需要更改调用站点以接收返回值。

3.静态或类变量:

如果 play() 和 main() 位于同一类或类实例中,请考虑使用静态或类变量:

class XYZ {
    static int toyNumber = 5;
    ...
}
public static void main(String[] args) {
    XYZ.play();
    System.out.println("Toy number in main " + XYZ.toyNumber);
}
static void play() {
    ...
    XYZ.toyNumber++;
    ...
}

此方法允许两个函数修改同一变量,但可能会导致并发问题,不建议用于多线程应用程序。

以上是如何在Java中实现基元的引用传递效果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn