静态内部类(嵌套内部类):
- 内部类定义时加上static关键字。
- 可以使用public 、protected 、default 、private修饰符。
- 只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
- 生成静态内部类对象的方式为:OuterClass.InnerClass innerObj = new OuterClass.InnerClass();
- 如果不需要内部类对象和它的外部类对象之间有联系,那么可以将内部类声明为static。这通常称为嵌套类。
- 要想理解static应用于内部类是的含义,必须记住,成员内部类(普通内部类、常规内部类)对象隐含地保存了一个外部类对象的引用,指向创建它的外部类的对象。可是,静态内部类却不是这样。
- 嵌套类意味着:a、创建嵌套类的对象的时候,并不需要外部类的对象。b、嵌套内部类对象不能访问非静态的外部类对象。
package com.qs.innerclass;
class OuterClass {
private static int a = 1;// 静态内部类可以访问
private int b = 2;// 静态内部类不能访问
public static void outerFuncOne() {// 静态内部类可以访问
}
public void outerFuncTwo() {// 静态内部类不能访问
}
public void outerFuncThree() {
// 外部类访问静态内部类的静态成员(直接使用类名访问)
System.out.println(StaticInnerClass.innerA);
StaticInnerClass.innerFuncOne();
// 外部类访问静态内部类的非静态成员(需要创建对象)
System.out.println(new StaticInnerClass().innerB);
new StaticInnerClass().innerFuncTwo();
}
static class StaticInnerClass {
// 静态内部类中可以存在静态成员
static int innerA = 3;
int innerB = 4;
static void innerFuncOne() {
// 静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
System.out.println("outer.a : " + a);
outerFuncOne();
}
void innerFuncTwo() {
// 静态内部类不能访问外部类的非静态成员(包括静态变量和静态方法)
// System.out.println("outer.b : " + b);
// outerFuncTwo();
System.out.println("innerFuncTwo");
}
}
}
public class StaticInner {
public static void main(String[] args) {
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.innerFuncOne();
OuterClass outer = new OuterClass();
outer.outerFuncThree();
}
}