【问题标题】:Java Scope Questions from a C++ background来自 C++ 背景的 Java 范围问题
【发布时间】:2015-07-08 08:46:14
【问题描述】:

我正在开发我的第一个 Android 应用程序,该应用程序来自学校 2 年的 C++。

代码如下所示:

double total = 100000000000L;
for(long i = 0L; i < diff; i++) {
    total += 1.8;
}
countView.setText(NumberFormat.getInstance().format(total));

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
     @Override
     public void run() {

         if (total += 1.8 < 200000000000L) {
            handler.postDelayed(this, 1000L);
            return;
         }

         handler.removeCallbacks(this);
     }
 }, 1000L);

在 C++ 中,我可以重用总变量没有问题 - 它在同一个范围内。但是在 Java 中,我收到一条错误消息,提示我正在尝试访问内部类。尝试将 total 声明为 public 或 static 会出现此处不允许使用修饰符的错误。

为什么我可以在我声明的地方使用 total ,但不能在下面几行使用?

【问题讨论】:

  • 您的total 到底在哪几行?你没有包括那个吗?
  • docs.oracle.com/javase/tutorial/java/javaOO/… ... 当然total 可能是外部类中的一个字段,一切都应该没问题.. 编辑:是的,正如@Codebender 所写,我们不知道你在哪里声明@987654326 @ 在方法中?或作为一个字段(当然不是,但这只是假设)
  • total 声明在顶部,并在 run 函数的 if 语句中使用

标签: java android scope


【解决方案1】:

在 Java 中,如果您想从本地类(如示例中的 Runnable)访问封闭类的成员(即示例中的 total),则必须将这些成员声明为 final

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

对于您的代码,不要使用double total,而是重写代码(如果可以的话),使total 变为整数并使用final AtomicInteger total。如果你不能重写,我会研究AtomicDouble alternatives

【讨论】:

    【解决方案2】:

    如果 total 是调用处理程序的类字段,它应该可以正常工作。如果它是在调用您的处理程序的函数中声明的,请尝试将其声明为“final”。唯一的问题是,通过将其声明为 final,您将无法修改它的值,就像您在 run() 方法中所做的那样。

    【讨论】:

    • total 只是一个原始数据类型,声明在代码块的顶部。 java是否将原始数据类型视为类,如果是,为什么我可以在for循环中使用它而不是在函数中使用它?
    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2013-03-05
    • 2014-04-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多