Java 从内部类访问变量需要声明为final-Error
我在尝试根据下面给出的代码写入变量时遇到了上述错误 我知道我可以通过全局声明变量(mPager)并使其成为最终变量来解决这个问题。但我不想让它成为最终版本,我想知道为什么会发生这样的错误,除了在全局或最终版本中声明它之外,还有其他修复方法吗Java 从内部类访问变量需要声明为final-Error,java,android,Java,Android,我在尝试根据下面给出的代码写入变量时遇到了上述错误 我知道我可以通过全局声明变量(mPager)并使其成为最终变量来解决这个问题。但我不想让它成为最终版本,我想知道为什么会发生这样的错误,除了在全局或最终版本中声明它之外,还有其他修复方法吗 public class fieldsActivity extends Activity { Button addSiteButton; Button cancelButton; Button signInButton; /** * Called w
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这有点不同,你可以从这里开始理解这个问题:。首先阅读以清楚地理解什么是静态(内部)类,并了解变量的行为,等等。然后您将了解原因。