Java 方法中变量复制的目的是什么?

Java 方法中变量复制的目的是什么?,java,Java,我在Android代码(和其他一些代码源)中看到了这一点。它的目的是什么 class Foo { int mBar = 1337; static void main(String... args) { System.out.println(isFubar()); } boolean isFubar() { int ret = mBar; // <--- Focus of attention if (ret

我在Android代码(和其他一些代码源)中看到了这一点。它的目的是什么

class Foo {
    int mBar = 1337;

    static void main(String... args) {
        System.out.println(isFubar());
    }

    boolean isFubar() {
        int ret = mBar; // <--- Focus of attention

        if (ret == 666)
            return true;
        else
            return false;
    }
}
class-Foo{
int mBar=1337;
静态void main(字符串…参数){
System.out.println(isFubar());
}
布尔isFubar(){

int ret=mBar;//我使用它,这样我可以在递归或循环中修改变量,而不会弄乱原始变量。它还有助于在类和其他方法之间传递变量

此外,如果在方法运行时更改了它,该方法将不会出错,它将继续使用它开始使用的变量。我在多线程处理图形打印和代码时遇到了这个主要问题。代码会更改变量,屏幕上会发生奇怪的事情


我不知道硬件和速度,但在代码方面,它在许多情况下都非常简单和灵活。

我想到了一些想法

  • 检索类成员变量所需的表达式可能非常复杂(您的示例并非如此),因此将其保存在局部变量中可能更具可读性

  • 将其存储在局部变量中可能更有效,尤其是当该方法必须多次访问该值时(您的示例没有这样做)

  • 一旦检索到该值,就会得到它在那个时刻的值,而不是另一个线程可能同时修改的某个稍后的值

  • 将其存储在局部变量中可以方便地使用调试器进行检查


  • 对于您的特定示例,只有原因(4)才有意义。

    可能是多线程。如果mPortrait的值在以下两行之间更改,则会产生混合结果

    final int hStartPadding = mPortrait ? mShortAxisStartPadding : mLongAxisStartPadding;
    final int vStartPadding = mPortrait ? mLongAxisStartPadding : mShortAxisStartPadding;
    
    例如:

    final int hStartPadding = true ? mShortAxisStartPadding : mLongAxisStartPadding;
    // somehwere else: mPortraint = false
    final int vStartPadding = false ? mLongAxisStartPadding : mShortAxisStartPadding;
    

    你能举出一个具体的例子吗?我不知道,但我会看看历史,看看是否有一个版本是重要的。也许开发人员只是讨厌“m疣”。但认真地说,通过制作副本并使副本成为最终副本,s/he表明此方法不会修改字段。@DavidV这是有意义的。我甚至没有想到这一点。@DwB您是否更喜欢
    mBar=8008
    ?;-)作为第一个响应,我同意是否修改了变量。对于第二个,这只对object重要s、 原语是按值传递的,因此是否传递了确切的变量并不重要。我同意,这是我能想到的唯一解释。我编辑了我的答案,记住了以前的问题。注意,它调用的是全局变量,而不是发送给方法的变量。
    final int hStartPadding = true ? mShortAxisStartPadding : mLongAxisStartPadding;
    // somehwere else: mPortraint = false
    final int vStartPadding = false ? mLongAxisStartPadding : mShortAxisStartPadding;