Java中的静态内部类是指在一个类的内部定义的另一个类,并且该内部类被声明为静态(static)的。静态内部类与普通内部类的区别在于,静态内部类不依赖于外部类的实例,可以直接通过外部类名访问。
// 静态内部类
class Outer{
public int data1 = 1;
/*外部类定义的属性(重名)*/
public static int data2 = 2;
public static int data3 = 3;
static {
System.out.println("外部类静态块");
}
/*成员方法*/
public void outerMothod() {
System.out.println("外部类的成员方法");
}
/*静态方法*/
public static void outerStaticMethod() {
System.out.println("外部类的静态方法");
}
public void test(){
System.out.println("Out:: test()");
}
static class Inner{
public int data4 = 4;
public static int data5 = 5;
public static int data3 = 33; //与外部类同名
public void InnerShow(){
// 访问内部类成员属性
System.out.println("内部类data4:"+data4);
//访问外部类成员属性
//不重名访问 非静态成员属性
//System.out.println(data1); //无法直接访问外部非静态成员
System.out.println("data1:" + new Outer().data1); // 间接访问
//不重名直接访问 静态成员属性
System.out.println("外部类data2:" + data2);
System.out.println("内部的data3:"+ data3);
System.out.println("外部的data3:"+ Outer.data3);
}
public static void InnerStaticShow() {
//调用时会先加载Outer类,类加载的时候执行静态代码块
outerStaticMethod();
}
}
/*外部类的内部如何和内部类打交道*/
public static void callInner() {
System.out.println(Inner.data3);
//System.out.println(Inner.data4); //内部类的非静态成员属性无法直接访问
System.out.println(new Inner().data4);
Inner.InnerStaticShow();
new Inner().InnerShow(); //调用内部类非静态成员方法
}
}
public class Test {
/* 其他类访问静态内部类 */
public static void main(String[] args) {
//访问静态内部类的静态方法,Inner类被加载(类加载的时候执行静态代码块),此时外部类未被加载,独立存在,不依赖于外部类。
Outer.Inner.InnerStaticShow();
// 静态内部类实例化,不用(),相比于实例内部类优点:不需要外部类的引用
Outer.Inner in = new Outer.Inner();
in.InnerShow();
}
}
总结:【抓住关键字——static,作为静态成员存在】
静态内部类可以包含任意的信息,可以被任意访问权限修饰符修饰。
静态内部类的方法只能访问外部类的static关联的成员。
静态内部类可以独立存在,不依赖于其他外围类。
其他类访问内部类的静态信息,直接 Outer.Inner.static成员信息 就可以了。
其他类实例化内部类 Outer.Inner instance = new Outer.Inner();,然后 instance. 成员信息(属性、方法)即可。