Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安卓&;Java内部类概念_Java_Android_Inner Classes_Nested Class - Fatal编程技术网

安卓&;Java内部类概念

安卓&;Java内部类概念,java,android,inner-classes,nested-class,Java,Android,Inner Classes,Nested Class,我按照链接尝试创建新的AlertDialog,如下所示 AlertDialog myAlertDialog = new AlertDialog.Builder(MainActivity.this).create(); 根据文档,AlerDialog是外部类,而Builder是AlertDialog中的内部类。现在,在访问内部类时,我将相同的概念与java链接起来,如下所示Outer myOuter2=new Outer.inner()这段代码在我尝试访问时出错,下面是完整的java代码 pac

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

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

Outer myOuter2 = new Outer.Inner();
也许你的意思是:

Outer.Inner myInner = new Outer.Inner();
内部
类需要声明为
静态
,才能工作


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

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的《有效Java》第二版第2项,以获得对构建器设计和基本原理的良好描述。在线提供:。

您可以看到,
AlertDialog.Builder
类是一个静态的内部类


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

要使代码按原样工作,您需要一个如下所示的

Outer.Inner myOuter2 = myOuter.new Inner();
这是因为它的行为非常类似于Outer中的任何其他非静态字段-它需要Outer的实例才能有效。无论如何,这通常不是一个好主意,因为public内部非静态类很少

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

static class Inner {
本质上,这将
internal
与其包含的类分离,它恰好位于它的内部,因此可以通过
new Outer.internal()
进行实例化。它可以在一个新的.java文件中作为一个公共类而快乐地生活

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


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

最后我明白了这是代码

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;

        }
    }
}

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

Outer o=new Outer();
Outer.Inner oi=o.new Inner();
这是创建非静态内部类对象的基本方法

假设您的内部类型为static(即
静态类内部{..}
), 然后,对于创建对象:

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

错误说明了什么?生成
class-Inner
static+Duncan的答案。这只解决了一个问题。Inner需要是一个静态的内部类。@gregkopf谢谢,答案已调整。
Outer.Inner oi=new Outer.inner();