【问题标题】:Android & Java inner class conceptAndroid & Java 内部类概念
【发布时间】:2013-06-25 13:47:37
【问题描述】:

我点击链接 http://developer.android.com/reference/android/app/AlertDialog.html 并尝试像这样创建新的 AlertDialog

AlertDialog myAlertDialog = new AlertDialog.Builder(MainActivity.this).create();

根据文档,AlerDialog 是外部类,Builder 是 AlertDialog 中的内部类。现在我在访问内部类时将相同的概念与 java 联系起来,像这样Outer myOuter2 = new Outer.Inner(); 当我尝试访问时,这条给出错误,这是完整的 java 代码

package com.test;

    public class Outer {
        public void OuterMethod() {
            System.out.println("OuterMethod");
        }

        public static void main(String[] args) {
            Outer myOuter = new Outer();

            myOuter.OuterMethod();
            Outer myOuter2 = new Outer.Inner();//this piece of code gives error

        }

        class Inner {

            Inner() {
                System.out.println("constructor Inner");
            }

            public void InnerMethod() {
                System.out.println("Inside InnerMethod");
            }
        }
    }

所以我在这里的问题是如何理解 android 中相同的内部类概念并访问其中的方法

【问题讨论】:

  • 错误说明了什么
  • 使class Inner静态+邓肯的答案。

标签: java android inner-classes nested-class


【解决方案1】:

您创建了一个内部非静态类(一个内部instance 类),而AlertDialog.Builder 是一个静态类。

要让您的代码按原样工作,您需要一个 interesting way of invoking new,如下所示:

Outer.Inner myOuter2 = myOuter.new Inner();

这是因为它的行为与 Outer 中的任何其他非静态字段非常相似——它需要 Outer 的实例才能有效。无论如何,这通常不是一个好主意,因为 public 内部非静态类很少见。

您更可能希望 Inner 成为一个静态类,即声明为:

static class Inner {

本质上,这将Inner 与其包含的类分离,它恰好存在于其中,因此可以通过new Outer.Inner() 实例化。它可以在新的 .java 文件中愉快地作为一个公共类独立存在。

当内部类仅用于与外部类的关系时,内部静态类很有用,因此它显示了它们之间的关系。

在 Android 的情况下,您仅在构建 AlertDialog 时使用 AlertDialog.Builder。如果它是其他类使用的通用 Builder(例如普通的 Dialog),则将被声明为它自己的公共类(即不嵌套在另一个类中的独立类)。

【讨论】:

    【解决方案2】:

    OuterInner 之间没有任何关系,只是它们共享一个类文件。因此,您不能输入:

    Outer myOuter2 = new Outer.Inner();
    

    也许你的意思是:

    Outer.Inner myInner = new Outer.Inner();
    

    Inner 类需要声明为 static 才能工作。


    请注意,普通构建器将返回一个与封闭类型相同的类型。这是一个使用与您的代码相似的类名的小示例:

    public class Outer {
    
      public static void main(String[] args) {
        Outer outer = new Outer.Builder().withParam("foo").build();
      }
    
      private final String someParam;
    
      private Outer(String someParam) {
        this.someParam = someParam;
      }
    
      public static class Builder {
    
        private String someParam;
    
        public Builder() {
        }
    
        public Builder withParam(String value) {
          this.someParam = value;
          return this;
        }
    
        public Outer build() {
          return new Outer(someParam);
        }
      }
    }
    

    您可能还希望阅读 Joshua Bloch 的 Effective Java, 2nd Edition 中的第 2 条,以获得对构建器设计和基本原理的良好描述。在线获取:here

    【讨论】:

    • 这只解决了一个问题。
    • Inner 需要是静态内部类。
    • @GregKopff 谢谢,答案已调整。
    【解决方案3】:

    您的内部类是非静态类型。 我们应该首先创建你的外部类的实例:

    Outer o=new Outer();
    Outer.Inner oi=o.new Inner();
    

    这是创建非静态内部类对象的基本方式。

    假设如果你的内部是静态类型(即static class Inner{....}), 然后用于创建对象:

    Outer.Inner oi=new Outer.inner();
    

    【讨论】:

      【解决方案4】:

      AlertDialog.Builder 类是一个静态内部类,如您所见 here

      public static class Builder {...}
      

      【讨论】:

        【解决方案5】:

        最后我发现这里是代码

        package com.test;
        
        public class Outer {
            public void OuterMethod() {
                System.out.println("OuterMethod");
            }
        
            public static void main(String[] args) {
                Outer myOuter = new Outer();
        
                myOuter.OuterMethod();
                Outer myOuter2 = new Outer.Inner().InnerMethod();
            }
        
            static class Inner {
        
                Inner() {
                    System.out.println("constructor Inner");
                }
        
                public Outer InnerMethod() {
                    Outer myOuter = new Outer();
                    System.out.println("Inside InnerMethod");
                    return myOuter;
        
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-07
          • 1970-01-01
          • 1970-01-01
          • 2017-01-13
          • 1970-01-01
          • 1970-01-01
          • 2014-06-06
          • 2019-02-05
          相关资源
          最近更新 更多