如何在Java中访问内部类中的非final变量号?

时间:2011-09-22 16:45:16

标签: java android

这是我第一次用Java编程,所以我无法理解为什么我无法访问函数之外的变量。我试图将变量更改为final,但仍然存在错误:

  

无法分配最终的局部变量编号,因为它是   在封闭类型中定义

如果变量中没有final关键字,则错误如下:

  

不能引用内部类中的非最终变量数   用不同的方法定义

这是我的代码:

        String[] number = this.nextNumber();
        Button submitbutton = (Button)findViewById(R.id.button1);
        submitbutton.setOnClickListener(new OnClickListener() {
              public void onClick(View v) {
                  // Perform action on clicks
                  //Toast.makeText(Addition.this, inp.getText(), Toast.LENGTH_SHORT).show();
                  if(inp.getText().toString().equals("")) {
                      Toast.makeText(Addition.this, "Please enter your answer", Toast.LENGTH_SHORT).show();
                  } else {
                      int answer = Integer.parseInt(inp.getText().toString());
                      if(Integer.parseInt(number[1]) == answer) {
                          Toast.makeText(Addition.this, "NICE!", Toast.LENGTH_SHORT).show();
                          int currentPoint = Integer.parseInt((String) points.getText());
                          currentPoint = currentPoint + 1;
                          points.setText(Integer.toString(currentPoint));
                          number = Addition.this.nextNumber(); // this part doesn't work. why?
                        } else {
                            Toast.makeText(Addition.this, "Wrong!", Toast.LENGTH_SHORT).show();
                      }
                  }
              }
          });

我对不起作用的部分发表评论。请告诉我原因

2 个答案:

答案 0 :(得分:5)

嗯,你遇到的两个规则正如编译器所说的那样:

  • 最终变量必须只分配一次 - 以后不能更改其值
  • 你可以从匿名内部类中访问本地变量(如果它们是最终的)

目前尚不清楚您正在尝试做什么,或为什么您正试图从OnClickListener中更改本地变量的值。这里的大局是什么?你可以在匿名内部类本身中声明一个变量,还是在你的类中使它成为一个实例变量?

如果您是Java新手,我会强烈建议您编写更简单的代码。匿名内部类是相对高级。

我实际上鼓励您在开始Android开发之前在桌面上使用Java作为语言 - 使用核心库(集合,IO等)以及其中任何有趣的语言内容一个简单的控制台应用程序,易于启动和调试,没有任何特定于Android的复杂性妨碍您。

答案 1 :(得分:0)

编辑:正如Jon所说使用侦听器来修改局部变量是没有用的,当侦听器为其赋值时,局部变量将超出范围而无法通过任何其他方式访问。只有当number生命超出此方法时,我在下面写的内容才有意义。

在匿名内部类中,您只能访问包含范围的final个变量。但是你不能指定到最终变量。通常的技巧是使用围绕非final变量的最终包装器。例如,如果numberString,而不是数组(String[]),那么以下内容将起作用:

   final String[] number = new String[] { this.nextNumber(); } 
           // number[0] has the number, number itself is final wrapper
   Button submitbutton = (Button)findViewById(R.id.button1);
   submitbutton.setOnClickListener(new OnClickListener() {
       public void onClick(View v) {
           // Perform action on clicks
           //Toast.makeText(Addition.this, inp.getText(), Toast.LENGTH_SHORT).show();
           if(inp.getText().toString().equals("")) {
               Toast.makeText(Addition.this, "Please enter your answer",              
                              Toast.LENGTH_SHORT).show();
           } else {
               int answer = Integer.parseInt(inp.getText().toString());
               if(Integer.parseInt(number[1]) == answer) {
                   Toast.makeText(Addition.this, "NICE!", Toast.LENGTH_SHORT).show();
                   int currentPoint = Integer.parseInt((String) points.getText());
                   currentPoint = currentPoint + 1;
                   points.setText(Integer.toString(currentPoint));
                   number[0] = Addition.this.nextNumber();
                   // number is final and cannot be assigned but number[0] can
               } else {
                   Toast.makeText(Addition.this, "Wrong!", Toast.LENGTH_SHORT).show();
               }
           }
          }
      });