Java非静态内部类为什么不能有静态成员

来源:互联网 发布:网络推广渠道有哪些 编辑:程序博客网 时间:2024/04/30 07:10

对于Java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化,那么必须先执行加载OuterClass,再加载Innerclass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。

Verion 0.11:

对于红色标记的部分,当时理解上有误,我们知道InnerClass可以有静态常量(static final),那么InnerClass类加载一定在OuterClass对象创建之前完成。


[java] view plain copy
  1. public class OuterClass {  
  2.       
  3.     static int k = printI();  
  4.       
  5.     static int printI(){  
  6.         System.out.println("Inner Class is loading before creating OuterClass instance");  
  7.         return InnerClass.i ;  
  8.     }  
  9.       
  10.     OuterClass(){  
  11.         System.out.println("OuterClass constructor");  
  12.     }  
  13.       
  14.     class InnerClass{  
  15.         private static final int i = 1;  
  16.           
  17.     }  
  18.     public static void main(String[] args) {  
  19.         OuterClass o;  
  20.     }  
  21. }  
  22. //* out:  
  23. // Inner Class is loading before creating OuterClass instance  

2 静态内部类可以有静态成员:

我们可以把静态内部类作为外部类OuterClass的一个静态成员,在执行类加载过程中,静态内部类在加载OuterClass后会进行初始化,同样的原理,静态内部类的静态成员也将被初始化,进行内存的分配,注意到,这时无论是内部类还是外部类,对象都没有实例化,这也说明了非静态内部类为什么不能有静态成员的原因。


[java] view plain copy
  1. public class OuterClass{  
  2.      static class InnerClass{  
  3.          private static int i;  
  4.      }  
  5. }  
0 0