曾在一份代码里,看到类中类,甚是困惑。写了如下demo代码,希望剖析一二。class AlertDialog {
AlertDialog() {
System.out.println("AlertDialog constructor enter");
this.AAA();
System.out.println("AlertDialog constructor exit");
}
void AAA() {
System.out.println("AlertDialog AAA enter");
System.out.println("AlertDialog AAA exit");
}
static class Builder {
Builder() {
System.out.println("Builder constructor enter");
this.BBB();
System.out.println("Builder constructor exit");
}
void BBB() {
System.out.println("Builder BBB enter");
System.out.println("Builder BBB exit");
}
}
}public class Demo_s {
public static void main(String args[]) {
System.out.println("main enter");
new AlertDialog();
new AlertDialog.Builder();
System.out.println("main exit");
}
}
AlertDialog() {
System.out.println("AlertDialog constructor enter");
this.AAA();
System.out.println("AlertDialog constructor exit");
}
void AAA() {
System.out.println("AlertDialog AAA enter");
System.out.println("AlertDialog AAA exit");
}
static class Builder {
Builder() {
System.out.println("Builder constructor enter");
this.BBB();
System.out.println("Builder constructor exit");
}
void BBB() {
System.out.println("Builder BBB enter");
System.out.println("Builder BBB exit");
}
}
}public class Demo_s {
public static void main(String args[]) {
System.out.println("main enter");
new AlertDialog();
new AlertDialog.Builder();
System.out.println("main exit");
}
}
AlertDialog() { //构造函数
System.out.println("AlertDialog constructor enter");
this.AAA(); //调用方法
System.out.println("AlertDialog constructor exit");
}
void AAA() {
System.out.println("AlertDialog AAA enter");
System.out.println("AlertDialog AAA exit");
}
static class Builder { //静态内部类,可以直接通过 new 外部类.内部类 的方式生成内部类实例
Builder() { //构造函数
System.out.println("Builder constructor enter");
this.BBB(); //调用方法
System.out.println("Builder constructor exit");
}
void BBB() {
System.out.println("Builder BBB enter");
System.out.println("Builder BBB exit");
}
} class XXX { //非静态内部类,不能直接通过 new 外部类.内部类 的方式生成实例,
//要通过 new 外部类实例.内部类 的方式生成实例
public XXX() { //构造函数
System.out.println("XXX");
}
}
}public class Demo_s {
public static void main(String args[]) {
System.out.println("main enter");
new AlertDialog();
new AlertDialog.Builder(); //生成静态内部类实例 new AlertDialog().new XXX(); //生成非静态内部类实例
System.out.println("main exit");
}
}
main enter
--------------------------------
AlertDialog constructor enter
AlertDialog AAA enter
AlertDialog AAA exit
AlertDialog constructor exit
--------------------------------
Builder constructor enter
Builder BBB enter
Builder BBB exit
Builder constructor exit
--------------------------------
AlertDialog constructor enter
AlertDialog AAA enter
AlertDialog AAA exit
AlertDialog constructor exit
Circle constructor enter
Circle CCC enter
Circle CCC exit
Circle constructor exit
--------------------------------
main exitclass AlertDialog {
//构造函数
AlertDialog() {
System.out.println("AlertDialog constructor enter");
this.AAA(); //调用方法
System.out.println("AlertDialog constructor exit");
}
void AAA() {
System.out.println("AlertDialog AAA enter");
System.out.println("AlertDialog AAA exit");
}
//静态内部类,可以直接通过 new 外部类.内部类 的方式生成内部类实例
static class Builder {
//构造函数
Builder() {
System.out.println("Builder constructor enter");
this.BBB(); //调用方法
System.out.println("Builder constructor exit");
}
void BBB() {
System.out.println("Builder BBB enter");
System.out.println("Builder BBB exit");
}
}
//非静态内部类,不能直接通过 new 外部类.内部类 的方式生成实例,
//要通过 new 外部类实例.内部类 的方式生成实例
class Circle {
//构造函数
Circle() {
System.out.println("Circle constructor enter");
this.CCC(); //调用方法
System.out.println("Circle constructor exit");
}
void CCC() {
System.out.println("Circle CCC enter");
System.out.println("Circle CCC exit");
}
}
}public class Demo_s {
public static void main(String args[]) {
System.out.println("main enter");
System.out.println("--------------------------------");
new AlertDialog();
System.out.println("--------------------------------");
new AlertDialog.Builder(); //生成静态内部类实例
System.out.println("--------------------------------");
new AlertDialog().new Circle(); //生成非静态内部类实例
System.out.println("--------------------------------");
System.out.println("main exit");
}
}
内部类要想直接通过外部类.内部类 必须声明成static
new AlertDialog.Builder(); // 这种情况必须把内部类声明成static