Java静态内部类的实例化问题
一、静态内部类介绍

(此处已添加圈子卡片,请到今日头条客户端查看)
静态内部类是指使用 static 修饰的内部类。示例代码如下:
public class Outer { static class Inner { // 静态内部类 }}
static修饰的类不是说它自己是静态类,而是说它是外部类的静态成员。
上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点:在创建静态内部类的实例时,不需要创建外部类的实例。
public class Outer { static class Inner { }}class OtherClass { Outer.Inner oi = new Outer.Inner();}
static 修饰的内部类可以被外部类通过 外部类.静态内部类 直接访问,而没用static 修饰的类在new 对象的时候要通过外部类的实例.内部类访问。
示例代码如下所示:
public class A{ public class B{}}
实例化B:
A a = new A();B b = a.new B();
如果B是静态的(全局的),即如下:
public class A{ public static class B{}}
实例化B:
B b = A.new B();或者B b = new A.B();
先理解如下结论:
1. 非静态内部类,必须有一个外部类的引用才能创建。
2. 在外部类的非静态方法中,因为有隐含的外部类引用this,所以可以直接创建非静态内部类。
3. 在外部类的静态方法中,因为没有this,所以必须先获得外部类引用,然后创建非静态内部类。
4. 静态内部类,不需要外部类引用就可以直接创建。
5. 同时静态内部类,也不能直接访问外部类的非静态方法。
6. 由此可以推测,非静态内部类之所以可以直接访问外部类的方法,是因为创建非静态内部类时,有一个隐含的外部类引用被传递进来。
完整示例代码如下所示:
public class Outer { private String name = "world"; public static void main(String[] args) { // 非静态内部类,必须有一个外部类的引用才能创建。 Inner inner = new Outer().new Inner(); inner.displayName(); new Outer().outerMethod(); // 可以直接创建静态内部类 new StaticInner().displayName(); } public void outerMethod() { Inner inner = new Inner(); inner.displayName(); Outer.Inner inner2 = new Outer.Inner(); inner2.displayName(); } public class Inner { String hello = "hello "; void displayName() { // 内部类可以访问外部类的任何变量 System.out.println(hello + name); } } public static class StaticInner { String hello = "HELLO "; void displayName() { // 静态内部类不能访问外部类的非静态变量 System.out.println(hello); } }}