在内部类前添加修饰符static,这个内部类就变为静态内部类了。一个静态内部类中可以声明static成员,但是非静态内部类中不可以声明静态成员,静态内部类有一个最大的特点,就是不可以使用外部类的非静态成员,所以静态内部类在程序开发中比较少见。
可以这样认为,普通的内部类对象隐式地在外部保存了一个引用,指向创建它的外部类对象,但如果内部类被定义为static,就会有更多的限制。静态内部类具有以下两个特点:
1、 如果创建静态内部类的对象,不需要其外部类的对象。
2、 不能从静态内部类的对象中访问非静态外部类的对象。
定义一个静态内部类StaticInnerClass,可以使用如下代码:
例子中,在内部类的doitInner()方法中调用成员变量x,由于Inner被修饰为static形式,而成员变量x却是非static类型的,所以在doitInner()方法中不能调用x变量。
进行程序测试时,如果在每一个Java文件中都设置一个主方法,将出现很多额外代码,而程序本身不需要这些主方法,为了解决这个问题,可以将主方法写入静态内部类中。
在静态内部类中定义主方法。
如果编译例子中的类,将生成一个名称为StaticInnerClass
I
n
n
e
r
的
独
立
类
和
一
个
S
t
a
t
i
c
I
n
n
e
r
C
l
a
s
s
类
,
只
要
使
用
j
a
v
a
S
t
a
t
i
c
I
n
n
e
r
C
l
a
s
s
Inner的独立类和一个StaticInnerClass类,只要使用java StaticInnerClass
Inner的独立类和一个StaticInnerClass类,只要使用javaStaticInnerClassInner,就可以运行主方法中的内容,这样当完成测试,需要将所有.class文件打包时,只要删除StaticInnerClass$Inner独立类即可。
内部类的继承:内部类和其他普通类一样可以被继承,但是继承内部类比继承普通类复杂,需要设置专门的语法来完成。
例:在项目中创建OutputInnerClass类,使OutputInnerClass类继承ClassA类中的内部类ClassB。
在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数需要继承内部类的外部类的引用,同时在构造方法体中使用a.super()语句,这样才为继承提供了必要的对象引用。