Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从内部类访问变量需要声明为final-Error_Java_Android - Fatal编程技术网

Java 从内部类访问变量需要声明为final-Error

Java 从内部类访问变量需要声明为final-Error,java,android,Java,Android,我在尝试根据下面给出的代码写入变量时遇到了上述错误 我知道我可以通过全局声明变量(mPager)并使其成为最终变量来解决这个问题。但我不想让它成为最终版本,我想知道为什么会发生这样的错误,除了在全局或最终版本中声明它之外,还有其他修复方法吗 public class fieldsActivity extends Activity { Button addSiteButton; Button cancelButton; Button signInButton; /** * Called w

我在尝试根据下面给出的代码写入变量时遇到了上述错误

我知道我可以通过全局声明变量(mPager)并使其成为最终变量来解决这个问题。但我不想让它成为最终版本,我想知道为什么会发生这样的错误,除了在全局或最终版本中声明它之外,还有其他修复方法吗

public class fieldsActivity extends Activity {

Button addSiteButton;
Button cancelButton;
Button signInButton;


/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    Pager adapter = new Pager();
    ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);  //Variable of CONCERN
    mPager.setAdapter(adapter);
    mPager.setCurrentItem(1);



    addSiteButton = (Button) findViewById(R.id.addSiteButton);
    addSiteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
           mPager.setCurrentItem(2, true); //Compilation error happens here.
        }


    });

这是java处理闭包的标准方式(在Java8中可能有所不同)。据我所知,当有内部类时,编译器通过自动生成的构造函数复制变量,而不是变量本身。然后,为了避免内部类内外的不一致,变量必须是final,否则一个部分的变量状态可能会过时。除非你让它全球化,ofc。

相关帖子:

将寻呼机设置为
final
Yes错误再清楚不过了,请将mPager设置为final。此链接可能会有所帮助,因为java 8中有所不同:)它们有效地引入了final概念。看,我在上班的路上读到,Java8是不同的,但我并没有在我的小屏幕上正确地看到它。无论如何感谢您的更新。@Andrei“为了避免内部类内外的不一致,变量必须是final,”我理解这个问题。但是如何使变量成为全局变量来解决这个问题呢?@anil_pulikoden这有点不同,你可以从这里开始理解这个问题:。首先阅读以清楚地理解什么是静态(内部)类,并了解变量的行为,等等。然后您将了解原因。