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

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 StaticTest
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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值