您的位置:首页 > 编程语言 > Java开发

java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类

2014-02-17 23:13 1356 查看
java 程序加载过程---3---申明类的静态对象===》常见的应用是单例模式(饿汉式)
大家知道,只要打开任何一个开源软件,看到很多在类申明时候同时申明一个静态对象,此种情况JVM是如何加载的呢?

以下步骤是针对下面程序例子来剖析,执行顺序会受到申明的静态对象位置而不一样

Step1:加载父类的静态变量

Step2:加载父类的静态代码块

Step3:加载子类的静态变量(public static int k=0; )

Step4:public static StaticTest s1=new StaticTest("s1"); ===》会引起对象实例化的过程

         Step4.1 :父类类中静态变量(类变量)(如若已经加载,JVM会跳过,不会重复赋值)

         Step4.2 :父类中静态代码块(如若已经加载,JVM会跳过,不会重复赋值)

         Step4.3 :子类的中静态变量(类变量)(如若已经加载,JVM会跳过,不会重复赋值)

         Step4.4 :子类中的静态代码块(如若已经加载,JVM会跳过,不会重复赋值)

         Step4.5:父类中的非静态变量

         Step4.6:父类中的非静态代码块

         Step4.7:父类构造函数

         Step4.8:子类中的非静态变量

         Step4.9:子类中的非静态代码块

        Step4.10:子类构造函数

以下代码已经给出了代码执行顺序以Step注释的

   class FatherStaticTest

   {

   public FatherStaticTest()//Step4.3 Step8.2

   {

       System.out.println("I am in the class Father");

   }

   public static int fi=100; //Step1

   public int fii=200;//Step4.1 Step8.1

   static //Step2

   {

         System.out.println("fi is"+fi);

   }

   {//Step4.2

         System.out.println("fii is "+fii);

   }

   }

    public class StaticTest extends FatherStaticTest {  

        public static int k=0; //Step3

        public static StaticTest s1=new StaticTest("s1");//Step4  

        public static int i=print("i");  //Step5

        public static int n=99;  //Step6

        public int j=print("j");  //Step4.4 Step8.3

          

        {  //Step4.5 Step 8.4

            print("构造块");  

        }  

          

        static  //Step7

        {  

            print("静态块");  

        }  

          

        public static int print(String s)  

        {  

            System.out.println(++k+":"+s+"\ti="+i+"\tn="+n);  

            ++n;  

            return ++i;  

        }  

          

        public StaticTest(String s)  //Step4.6 Step 8.5

        {  

            System.out.println(++k+":"+s+"\ti="+i+"\tn="+n);  

            ++i;  

            ++n;  

        }  

      

        public static void main(String[] args) {  

            new StaticTest("Ben"); //Step8

             //StaticTest.print("ben");

            

        }  

    } 

执行结果如下:

D:\myjava>java StaticTes
4000
t

fi is100

fii is 200

I am in the class Father

1:j     i=0     n=0

2:构造块        i=1     n=1

3:s1    i=2     n=2

4:i     i=3     n=3

5:静态块        i=4     n=99

fii is 200

I am in the class Father

6:j     i=5     n=100

7:构造块        i=6     n=101

8:Ben   i=7     n=102

D:\myjava>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐