我跟着链接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中理解相同的内部类概念并访问其中的方法
答案 0 :(得分:12)
您已经创建了一个内部非静态类(内部实例类),而AlertDialog.Builder
是一个静态类。
要使代码按原样运行,您需要interesting way of invoking new
,如下所示:
Outer.Inner myOuter2 = myOuter.new Inner();
这是因为它的行为与Outer中的任何其他非静态字段非常相似 - 它需要一个Outer实例才能生效。无论如何,这通常不是一个好主意,因为公共内部非静态类很少见。
您更希望Inner
成为静态类,即声明为:
static class Inner {
基本上这会将Inner
与其包含的类分离,它恰好存在于其中,因此可以通过new Outer.Inner()
进行实例化。它可以很高兴地在一个新的.java文件中作为一个公共类来生活。
当内部类仅用于外部类时,内部静态类很有用,因此它显示了它们之间的关系。
在Android的情况下,只有在构建AlertDialog.Builder
时才使用AlertDialog
。如果它是其他类使用的通用Builder
(例如普通的Dialog
),则会将其声明为自己的公共类(即不嵌套在另一个类中的独立类)。
答案 1 :(得分: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,2nd Edition 的第2项,以获得有关构建器设计和基本原理的详细说明。在线提供:here。
答案 2 :(得分:0)
AlertDialog.Builder
类是静态内部类,您可以看到here。
public static class Builder {...}
答案 3 :(得分: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;
}
}
}
答案 4 :(得分:0)
您的内部类是非静态类型。 我们应该首先创建您的外部类的实例:
Outer o=new Outer();
Outer.Inner oi=o.new Inner();
这是创建非静态内部类对象的基本方法。
假设您的内部类型为静态(即static class Inner{....}
),
然后用于创建对象:
Outer.Inner oi=new Outer.inner();