如何在 Java 中对原语执行等效的按引用传递 [英] How to do the equivalent of pass by reference for primitives in Java

查看:19
本文介绍了如何在 Java 中对原语执行等效的按引用传递的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个Java代码:

公共类 XYZ {公共静态无效主(){int toyNumber = 5;XYZ 温度 = 新 XYZ();temp.play(toyNumber);System.out.println("主玩具编号" + toyNumber);}无效播放(int toyNumber){System.out.println("正在玩的玩具编号" + toyNumber);玩具编号++;System.out.println("递增后的玩具编号" + toyNumber);}}

将输出:

<前>游戏中的玩具编号 5第 6 步之后的玩具编号主要 5 中的玩具编号

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

void main(){int toyNumber = 5;玩(玩具编号);cout<<主要玩具编号" <<玩具编号<<结束;}void play(int &toyNumber){cout<<游戏中的玩具号码" <<玩具编号<<结束;玩具编号++;cout<<递增后游戏中的玩具编号"<<玩具编号<<结束;}

C++ 输出如下:

<前>游戏中的玩具编号 5第 6 步之后的玩具编号主要 6 中的玩具编号

我的问题是 - 考虑到 Java 是按值传递而不是按引用传递?

解决方案

您有多种选择.最有意义的方法实际上取决于您要尝试做什么.

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

class MyToy {public int toyNumber;}

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

void play(MyToy 玩具){System.out.println("正在玩的玩具编号" + toy.toyNumber);toy.toyNumber++;System.out.println("递增后游戏中的玩具编号" + toy.toyNumber);}

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

int play(int toyNumber){System.out.println("正在玩的玩具编号" + toyNumber);玩具编号++;System.out.println("递增后的玩具编号" + toyNumber);返回玩具编号}

这个选择需要对 main 中的调用点做一个小的改变,以便它读取,toyNumber = temp.play(toyNumber);.

选择 3:使其成为类或静态变量

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

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

这被认为是一种黑客行为,但有时用于从内联类调用中返回值.

void play(int [] toyNumber){System.out.println("正在玩的玩具编号" + toyNumber[0]);玩具编号[0]++;System.out.println("递增后的玩具编号" + toyNumber[0]);}

This Java code:

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);   
    }   
}  

will output this:

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

In C++ I can pass the toyNumber variable as pass by reference to avoid shadowing i.e. creating a copy of the same variable as below:

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;   
} 

and the C++ output will be this:

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

My question is - What's the equivalent code in Java to get the same output as the C++ code, given that Java is pass by value rather than pass by reference?

解决方案

You have several choices. The one that makes the most sense really depends on what you're trying to do.

Choice 1: make toyNumber a public member variable in a class

class MyToy {
  public int toyNumber;
}

then pass a reference to a MyToy to your method.

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);   
}

Choice 2: return the value instead of pass by reference

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
}

This choice would require a small change to the callsite in main so that it reads, toyNumber = temp.play(toyNumber);.

Choice 3: make it a class or static variable

If the two functions are methods on the same class or class instance, you could convert toyNumber into a class member variable.

Choice 4: Create a single element array of type int and pass that

This is considered a hack, but is sometimes employed to return values from inline class invocations.

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]);   
}

这篇关于如何在 Java 中对原语执行等效的按引用传递的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆