【问题标题】:Type Cannot refer to a non-final variable Asortiment inside an inner class defined in a different method类型不能引用在不同方法中定义的内部类中的非最终变量 Asortiment
【发布时间】:2012-12-19 18:20:56
【问题描述】:

我将简单的类添加到我的应用程序中:

public class Nomenklatura implements Serializable
    {
        private Boolean SmenaIsOpen=false;
        public Nomenklatura()
        {
            SmenaIsOpen=false;
        }
        public String OpenSmena()
        {
            SmenaIsOpen=true;
            return "ok";
        }
        public String CloseSmena()
        {
            return "ok";
        }
        public Boolean GetSmenaIsOen()
        {
            return SmenaIsOpen;
        }
        public void SetSmenaIsOen(Boolean val)
        {
            SmenaIsOpen=val;
        }

    }

应用程序应该使用这个类的一个对象。 当我在活动中使用它时:

@Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.presmena);  
        Nomenklatura Asortiment;
         Asortiment=(Nomenklatura) getIntent().getExtras().getSerializable("Nomenklatura");
         Button but1=(Button) findViewById(R.id.button1);
            but1.setOnClickListener(new OnClickListener() 
            {
                @Override
                public void onClick(View arg0) 
                {
                    if(Asortiment.GetSmenaIsOen()) Asortiment.CloseSmena();
                    else Asortiment.OpenSmena();
                }
            });
    }

我收到错误:无法在不同方法 Presmena.java 中定义的内部类中引用非最终变量 Asortiment。 帮助理解,有什么问题

【问题讨论】:

  • 最终确定:final Nomenklature Asortiment = (Nomenklatura) ....
  • 请尊重 Java 命名约定。变量以小写字母开头。方法也一样。另请阅读这篇文章:stackoverflow.com/questions/11185321/…

标签: java android


【解决方案1】:

这样声明

final Nomenklatura Asortiment = ...

它应该可以工作。当您声明内部类并让它们使用您的局部变量时(如果您考虑一下,通常会超出内部范围),它们需要被捕获。在 Java 中,您需要将此类变量标记为 final,以避免出现意外行为。

【讨论】:

    【解决方案2】:

    你必须将你的 Asortiment 变量声明为 final

    final Nomenklatura Asortiment;
    

    【讨论】:

    • 您必须在此处将Asortiment 初始化为某个值。因为它是最终的,您以后将无法对其进行初始化。
    • 好吧,你必须初始化它,但你不必在这里做。您可以编写类似这样的最终对象 obj; obj = 新对象();它将是有效的
    猜你喜欢
    • 2010-11-20
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多