Android与Java内部类概念
我按照链接http://developer.安卓.com/reference/安卓/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");
}
}
}
所以我这里的问题是如何理解安卓中相同的内部类概念,以及如何访问其中的方法
# 1 楼答案
Outer
和Inner
之间没有关系,只是它们共享一个类文件。因此,您不能键入:也许你的意思是:
Inner
类需要声明为static
才能工作请注意,普通生成器将返回与封闭类型相同的类型。下面是一个使用与代码类似的类名的小示例:
您可能还希望阅读Joshua Bloch的《有效的Java》第二版第2项,以更好地描述建筑设计和基本原理。网上提供:here
# 2 楼答案
AlertDialog.Builder
类是一个静态内部类,如您所见here# 3 楼答案
最后我发现这里是代码
# 4 楼答案
您的内部类是非静态类型。 我们应该首先创建外部类的实例:
这是创建非静态内部类对象的基本方法
假设您的内部类型为static(即
static class Inner{....}
), 然后,对于创建对象:# 5 楼答案
您已经创建了一个内部非静态类(内部实例类),而
AlertDialog.Builder
是一个静态类要使代码按原样工作,需要一个interesting way of invoking ^{} 如下所示:
这是因为它的行为非常类似于Outer中的任何其他非静态字段-它需要Outer的实例才能有效。无论如何,这通常不是一个好主意,因为public内部非静态类很少
您更可能希望
Inner
是一个静态类,即声明为:本质上,这将
Inner
与其包含的类解耦,它恰好位于它内部,因此可以通过new Outer.Inner()
进行实例化。在一个新的世界里,它可以作为一个公共阶层以自己的权利快乐地生活。而不是java文件当内部类仅用于与外部类的关系时,内部静态类非常有用,因此它显示了它们之间的关系
在Android的例子中,只有在构建
AlertDialog
时才使用AlertDialog.Builder
。如果它是其他类(例如普通类)使用的通用类Builder
,则它将被声明为自己的公共类(即不嵌套在另一个类中的独立类)