6

我按照链接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 中相同的内部类概念并访问其中的方法

4

5 回答 5

13

您已经创建了一个内部非静态类(一个内部实例类),而AlertDialog.Builder它是一个静态类。

要让您的代码按原样工作,您需要一种有趣的调用方式new,如下所示:

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

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

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

static class Inner {

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

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

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

于 2013-06-25T13:57:40.927 回答
6

除了它们共享一个类文件之外,它们Outer之间没有任何关系。Inner因此,您不能键入:

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,第 2 版的第 2 条,以获得对构建器设计和基本原理的良好描述。在线提供:这里

于 2013-06-25T13:49:55.173 回答
1

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

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

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

假设您的内部是静态类型(即static class Inner{....}),那么用于创建对象:

Outer.Inner oi=new Outer.inner();
于 2018-07-22T07:24:10.370 回答
0

AlertDialog.Builder如您在此处看到的,该类是一个静态内部类。

public static class Builder {...}
于 2013-06-25T13:51:41.770 回答
0

最后我发现这里是代码

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;

        }
    }
}
于 2013-06-26T05:09:31.477 回答