特点:可以把静态内部类当作外部类的一个【静态成员】
- 和静态成员一样,静态内部类用 static 定义,可以用 public,protected,private修饰
- 和静态成员一样,静态内部类随着外部类的加载而产生,可以用外部类类名+静态成员名直接获得
- 和静态方法不一样的是,静态内部类中可以定义静态的也可以定义非静态的成员
外部类访问内部类方式:
- 1.1、外部类可以直接访问静态内部类【 new Inner().静态内部类的成员】
- 1.2、外部类的[静态和非静态]成员都可以用【Outer.Inner.成员】访问内部类的[静态]成员
- 1.3、外部类的[静态和非静态]成员都可以用【new Outer.Inner().成员】访问内部类的[非静态]成员
- 1.4、其他地方访问内部类可用【new Outer.Inner().成员】,其中访问静态成员还可以用【Outer.Inner.成员】
内部类访问外部类方式:
- 2.1、若内部类的[静态和非静态]成员和外部类的[静态]成员不同名,可以直接用【成员名】访问
- 2.2、同名时,内部类的[静态和非静态]成员可以用【Outer.成员】访问外部类的[静态]成员
- 2.3、内部类的[静态和非静态]成员可以用【new Outer().成员】访问外部类的[非静态]成员
// 外部类之外的其他类
class InnerClassDemo {
public static void main(String[] args) {
new Outer.Inner2().innerSpeak(); //1.4
new Outer.Inner2().innerSpeak2(); //1.4
Outer.Inner2.innerSpeak(); //1.4
}
}
//外部类
class Outer {
private static int age = 1;
private String name = "外部类";
private Inner2 ooo = new Inner2(); //1.1
public void method() {
new Inner2().innerSpeak();//1.1
new Outer.Inner2().innerSpeak(); //1.1
Outer.Inner2.innerSpeak();//1.2
new Outer.Inner2().innerSpeak2(); //1.3
}
//静态内部类
static class Inner2 {
private static String name = "静态内部类";
static void innerSpeak() {
System.out.println(age + "..." + Outer.age + "..." + name + "..." + new Outer().name);//2.1、2.2、2.3
}
void innerSpeak2() {
System.out.println("静态内部类的非静态方法");
}
}
}