繁体   English   中英

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

[英]How do i access the non-final variable number inside an inner class in Java?

这是我第一次用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();
                      }
                  }
              }
          });

我对无效的部分发表了评论。 请告诉我为什么

好吧,您要遵循的两个规则与编译器所声明的完全相同:

  • 最终变量必须只分配一次-您以后不能更改其值
  • 如果它们是最终的,则只能从匿名内部类访问局部变量

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

如果您不熟悉Java,我强烈建议您以更简单的代码开始。 匿名内部类相对高级。

实际上,我鼓励您在开始Android开发之前在桌面上使用Java作为一种语言 -在一个简单的控制台应用程序中使用核心库(集合,IO等)和该语言的任何有趣的部分进行操作并进行调试,而不会遇到任何特定于Android的复杂情况,这会妨碍您。

编辑:正如乔恩所说,使用侦听器修改局部变量是没有用的,当侦听器为它分配一个值时,局部变量将超出范围,并且无法通过任何其他方式访问。 只有当number寿命超出此方法时,我在下面写的内容才有意义。

在匿名内部类内部,您只能访问包含作用域的final变量。 但是您不能分配给最终变量。 通常使用的技巧是在非最终变量周围使用最终包装。 例如,如果number是一个String ,而不是一个数组( 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();
               }
           }
          }
      });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM