【问题标题】:access variables of outer class in JavaJava中外部类的访问变量
【发布时间】:2012-03-03 09:46:59
【问题描述】:

在 Java android 应用程序中,我如何从内部匿名类访问外部类的变量? 示例:

    ProgressDialog dialog = new ProgressDialog(this);
    .....
    send.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) {

           //here i'd like to do something with **dialog** variable
           .......

        }
    });

【问题讨论】:

    标签: java local-variables anonymous-inner-class


    【解决方案1】:

    如果对话框变量是外部类的字段,可以使用this前缀外部类名(a qualified this):

    send.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) {
           ProgressDialog dlg = OuterClass.this.dialog;
           .......
        }
    });
    

    或者,如果 dialiog 变量是局部变量,则需要将其标记为 final:

    final ProgressDialog dialog = new ProgressDialog(this);
    .....
    send.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) {
           // The dialog variable is in scope here ...
           dialog.someMethod();
        }
    });
    

    【讨论】:

    • dialog 是外部类的字段时,这是正确的答案。我认为在这种情况下,它是内部类周围方法中的局部变量。
    • 我很高兴 java 支持这个,所以我不必想出不同的怪名字
    【解决方案2】:

    使外部局部变量(dialogfinal,以便您可以从内部类中引用它。

    【讨论】:

      【解决方案3】:

      如果它是一个局部变量(就像签名所暗示的那样),它需要是 final 以便内部类能够访问它。如果它是成员变量,则可见性修饰符需要为默认值(无修饰符)或更高(受保护或公共)。使用private -modifier,它仍然有效,但您可能会收到警告(取决于您的编译器设置):

      对封闭字段 SomeClass.someField 的读取访问权限由 合成存取方法

      【讨论】:

      • 关于成员变量的部分不正确。内部类可以访问封闭类的私有成员——编译器为这些成员生成隐藏的访问器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2013-07-08
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多