Android和Java内部类概念

Use*_*902 6 java android nested-class inner-classes

我按照http://developer.android.com/reference/android/app/AlertDialog.html链接,我尝试创建这样的新AlertDialog

AlertDialog myAlertDialog = new AlertDialog.Builder(MainActivity.this).create();
Run Code Online (Sandbox Code Playgroud)

根据文档,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");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Mot*_*rom 13

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

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

Outer.Inner myOuter2 = myOuter.new Inner();
Run Code Online (Sandbox Code Playgroud)

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

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

static class Inner {
Run Code Online (Sandbox Code Playgroud)

基本上这与Inner它的包含类分离,它恰好生活在它内部,因此可以通过实例化new Outer.Inner().它可以很高兴地在一个新的.java文件中作为一个公共类来生活.

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

在Android的情况下,你AlertDialog.Builder只在构建时才使用AlertDialog.如果它是Builder其他类(例如普通的Dialog)使用的通用,那么它将被声明为它自己的公共类(即一个没有嵌套在另一个类中的独立类).


Dun*_*nes 6

有没有关系OuterInner不同之处在于它们共享类文件.因此,您无法输入:

Outer myOuter2 = new Outer.Inner();
Run Code Online (Sandbox Code Playgroud)

也许你的意思是:

Outer.Inner myInner = new Outer.Inner();
Run Code Online (Sandbox Code Playgroud)

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可能还希望阅读Joshua Bloch的Effective Java第2版的第2项,以便更好地描述构建器设计和基本原理.可在线获取:此处.