当前位置: 首页 > 面试题库 >

如何在Java中执行等效的按引用传递

景胜涝
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我是一个完整的Java新手。我知道Java将所有参数都视为按值传递,并且还有其他几个线程可以解释这一点。 例如,在C ++中,我可以执行以下操作: 哪个将输出3。我知道在Java中,所有参数都是按值传递的,因此您无法操纵传入的参数。在Java中,有没有一种标准的方法来 模拟 按引用传递?有没有办法调用操作传入变量的函数?对于我来说,很难绕开没有办法做到这一点的想法。 问题答案: 模拟传

  • 问题内容: 我读了许多文章,都说Java是通过价值传递的。但是我仍然不能解释按值传递和引用之间的区别。我写了一个示例程序,它像这样执行。 执行 谁能向我解释这些问题… 价值传递是什么意思? 答:它只是将存储在变量中的数字或值传递给函数。我是对还是错。 How do you say Java是通过价值传递? 为什么Java是按值传递而不是按引用传递? 上面的程序Tries是否显示了“按值传递”和“引

  • 问题内容: 我想从Java方法返回对Scala对象的引用。我怎样才能做到这一点? 我的Scala对象是这样的: …并且我希望我的Java方法像这样: 有没有办法做到这一点? 问题答案: 应该管用。 编辑:之所以可行,是因为这是Scala表示单例对象的方式。该类中有一个名为的字段,其中填充有该类的单个有效实例。但是还有一个叫做的类,它将所有方法复制为静态方法。这样一来,您就可以在大多数情况下像Jav

  • 是否有可能基于“if”“like”语句或xslt中的等价物写出xml? 我有一个名为“cust_code”的元素,如果该元素以“HE”开头,那么我想把它写出来,否则跳到下一个。 可能吗?

  • 这是我第一次在项目中使用Java,我需要这样做: 发送CoAP POST请求以打开致动器 但它抛出一个错误无法到达的语句,我不明白为什么:(

  • 问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未