java 原语_如何在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变量作为参考传递以避免阴影,即创建如下相同变量的副本:

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

#1 热门回答(161 赞)

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

选择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中的callsite进行少量更改,以便读取,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]);

}

#2 热门回答(25 赞)

Java不是通过引用调用it is按值调用仅

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

因此,如果你使用Mutable对象,你将看到所需的行为

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(); Collections.shuffle();这些方法不会返回新列表,但会修改它的参数对象。

List mutableList = new ArrayList();

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)

#3 热门回答(14 赞)

做一个

class PassMeByRef { public int theValue; }

然后将引用传递给它的实例。请注意,最好避免使用其参数改变状态的方法,尤其是在并行代码中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值