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. 成员信息(属性、方法)即可。