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

查看:84
本文介绍了如何在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);   
    }   
}  

将输出:

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

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

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

和C ++输出将是:


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

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

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.

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

class MyToy {
  public int toyNumber;
}

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

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

选择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);

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

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

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

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

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

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

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天全站免登陆