如何在 Java 中为基元执行相当于按引用传递的操作

新手上路,请多包涵

这个Java代码:

 public class XYZ {
    public static void main(){
        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 increement " + toyNumber);
    }
}

将输出这个:


玩中的玩具编号 5
增量 6 后正在玩的玩具编号
玩具号主5

在 C++ 中,我可以通过引用传递 toyNumber 变量以避免阴影,即创建相同变量的副本,如下所示:

 void main(){
    int toyNumber = 5;
    play(toyNumber);
    cout << "Toy number in main " << toyNumber << endl;
}

void play(int &toyNumber){
    cout << "Toy number in play " << toyNumber << endl;
    toyNumber++;
    cout << "Toy number in play after increement " << toyNumber << endl;
}

C++ 输出将是这样的:

玩中的玩具编号 5
增量 6 后正在玩的玩具编号
玩具编号主6

我的问题是——假设 Java 是按值传递而不是按引用传递, Java 中获得与 C++ 代码相同输出的等效代码是什么?

原文由 Student 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 491
2 个回答

你有几个选择。最有意义的那个真的取决于你想做什么。

选择 1:使 toyNumber 成为类中的公共成员变量

class MyToy {
  public int toyNumber;
}

然后将对 MyToy 的引用传递给您的方法。

 void play(MyToy toy){
    System.out.println("Toy number in play " + toy.toyNumber);
    toy.toyNumber++;
    System.out.println("Toy number in play after increement " + toy.toyNumber);
}

选择 2:返回值而不是通过引用传递

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

此选择需要对 main 中的调用站点进行小的更改,使其显示为 toyNumber = temp.play(toyNumber);

选择 3:将其设为类或静态变量

如果这两个函数是同一类或类实例上的方法,则可以将 toyNumber 转换为类成员变量。

选择 4:创建一个 int 类型的单元素数组并传递它

这被认为是 hack,但有时用于从内联类调用返回值。

 void play(int [] toyNumber){
    System.out.println("Toy number in play " + toyNumber[0]);
    toyNumber[0]++;
    System.out.println("Toy number in play after increement " + toyNumber[0]);
}

原文由 laslowh 发布,翻译遵循 CC BY-SA 3.0 许可协议

Java不是 通过引用 调用它只是 通过值调用

但是所有对象类型的变量实际上都是指针。

因此,如果您使用可变对象,您将看到您想要的行为

public class XYZ {

    public static void main(String[] arg) {
        StringBuilder toyNumber = new StringBuilder("5");
        play(toyNumber);
        System.out.println("Toy number in main " + toyNumber);
    }

    private static void play(StringBuilder toyNumber) {
        System.out.println("Toy number in play " + toyNumber);
        toyNumber.append(" + 1");
        System.out.println("Toy number in play after increement " + toyNumber);
    }
}

此代码的输出:

 run:
Toy number in play 5
Toy number in play after increement 5 + 1
Toy number in main 5 + 1
BUILD SUCCESSFUL (total time: 0 seconds)

您也可以在标准库中看到这种行为。例如 Collections.sort();集合.shuffle();这些方法不返回新列表但修改它的参数对象。

     List<Integer> mutableList = new ArrayList<Integer>();

    mutableList.add(1);
    mutableList.add(2);
    mutableList.add(3);
    mutableList.add(4);
    mutableList.add(5);

    System.out.println(mutableList);

    Collections.shuffle(mutableList);

    System.out.println(mutableList);

    Collections.sort(mutableList);

    System.out.println(mutableList);

此代码的输出:

 run:
[1, 2, 3, 4, 5]
[3, 4, 1, 5, 2]
[1, 2, 3, 4, 5]
BUILD SUCCESSFUL (total time: 0 seconds)

原文由 Kerem Baydoğan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题