博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

static变量、实例变量的初始化以及类加载顺序过程

Posted on 2012-04-05 17:01  月不识己  阅读(7299)  评论(0编辑  收藏  举报
public class Outer {
  2 
  3     
  4     public Outer() {
  5         System.out.print("a");//构造方法,new的时候才会出现,且后于变量的创建
  6     }
  7     
  8     
  9     
 10     public static void sayOther(String s){
 11         System.out.print(s);
 12     }
 13     
 14     
 15     
 16     public int say(String s){
 17         System.out.print(s);
 18         return 0;
 19     }
 20     
 21     
 22     //初始化块,在new时,构造方法之前,变量之前执行
 23     {
 24         System.out.print("c");
 25         inner.innerMethed("d");
 26     }
 27     
 28     
 29     private static inner t= new inner();//静态变量,这些都是在类加载完之前就放于内存中,且只加载这一次,new类对象时是不会再次执行的了。
 30     static
 31     {
 32         System.out.print("e");
 33         inner.innerMethed("f");//静态初始化块,整个静态的都是在加载之前就做好初始化。
 34         new inner();
 35     }
 36     
 37     
 38     private int i=say("g");//在new时,先于构造但是后于初始化块的一个实例变量,也即:实例对象:(实例初始化块,实例变量)--->构造方法
 39     private inner tt=new inner();//整个是在类加载ClassLoader之后初始化变量时,才做。每个new对象都会执行上面这个步骤
 40     private innerOther ttt=new innerOther();
 41     
 42     
 43     
 44     static class inner{
 45         
 46         
 47         public inner(){
 48             System.out.print("h");
 49         }
 50         
 51         
 52         public static void innerMethed(String s){
 53             System.out.print(s);
 54         }
 55         
 56         
 57         
 58         {
 59             System.out.print("i");
 60         }
 61         
 62         
 63         
 64         static
 65         {
 66             System.out.print("j");
 67         }
 68         
 69         
 70     }
 71     
 72     
 73     
 74     class innerOther{
 75         
 76         
 77         public innerOther(){
 78             System.out.print("k");
 79         }
 80         
 81         
 82         {
 83             System.out.print("l");
 84         }
 85         
 86         
 87         
 88     }
 89     
 90     
 91     
 92     public static void main(String[] args) {
 93         System.out.print("m");
 94         Outer outer = new Outer();
 95         System.out.print("n");
 96         
 97         //总结就是:类对象,变量的加载顺序
 98         //在整个类加载完成之后,就初始化静态(静态变量,静态块),其中可以new对象,别的类调用静态方法。静态的只做这一次,然后类加载器ClassLoader就把类Class返还,执行main方法。
 99         //在new类对象时,执行顺序是:(实例初始化块,实例变量)-->构造方法。每new一个对象时,都会执行这个步骤。
100         
101         //(静态变量、静态初始化块)—— 》 (变量、初始化块)—— 》 构造函数,()中的内容是按照代码前后循序执行
102        
103         //当有继承关系时,还是基于这个原理,如new Son();
104         //父类的静态(块和变量)-->子类的静态(块和变量)-->父类的(块和变量+构造方法)-->子类的(块和变量+构造方法)
105         //
106     }
107 }

//类的是通过:装载,连接,初始化
//java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下: 
//1、首先加载要创建对象的类及其直接与间接父类。 
//2、在类被加载的"同时"会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。 <clinit>
//3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。 
//4、最后执行构造器,构造器执行完毕,对象生成。