zl程序教程

您现在的位置是:首页 >  后端

当前栏目

浅谈Java变量的初始化顺序详解

JAVA变量 详解 浅谈 初始化 顺序
2023-06-13 09:15:00 时间

规则1(无继承情况下):
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是
(静态变量、静态初始化块)>(变量、初始化块)>构造器
证明代码:

复制代码代码如下:

publicclassInitialOrderTest{
   //静态变量
   publicstaticStringstaticField="静态变量";
   //变量
   publicStringfield="变量";
   //静态初始化块
   static{
       System.out.println(staticField);
       System.out.println("静态初始化块");
   }
   //初始化块
   {
       System.out.println(field);
       System.out.println("初始化块");
   }
   //构造器
   publicInitialOrderTest(){
       System.out.println("构造器");
   }
   publicstaticvoidmain(String[]args){
       newInitialOrderTest();
   }
}

结果显示:
静态变量
静态初始化块
变量
初始化块
构造器

规则2(有继承情况下):
子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成

复制代码代码如下:

classParent{
   //静态变量
   publicstaticStringp_StaticField="父类--静态变量";
   //变量
   publicStringp_Field="父类--变量";
   //静态初始化块
   static{
       System.out.println(p_StaticField);
       System.out.println("父类--静态初始化块");
   }
   //初始化块
   {
       System.out.println(p_Field);
       System.out.println("父类--初始化块");
   }
   //构造器
   publicParent(){
       System.out.println("父类--构造器");
   }
}//如果你想把这两个类放在同一个文件且名字起为SubClass,父类前不能加public
publicclassSubClassextendsParent{ 
   //静态变量
   publicstaticStrings_StaticField="子类--静态变量";
   //变量
   publicStrings_Field="子类--变量";
   //静态初始化块
   static{
       System.out.println(s_StaticField);
       System.out.println("子类--静态初始化块");
   }
   //初始化块
   {
       System.out.println(s_Field);
       System.out.println("子类--初始化块");
   }
   //构造器
   publicSubClass(){
       System.out.println("子类--构造器");
   }
   //程序入口
   publicstaticvoidmain(String[]args){
       newSubClass();
   }
}

结果显示:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

规则2(静态变量和静态初始化块):
静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初
始化块也遵循这个规律。

复制代码代码如下:
publicclasstestOrder{
   //静态变量
   publicstaticTestAa=newTestA();
   publicTestCc=newTestC();
   //静态变量
   publicstaticTestBb=newTestB();
   publictestOrder(){
       System.out.println("inconstract");
   }
   //静态初始化块
   static{
       System.out.println("静态初始化块");
   }
   publicstaticvoidmain(String[]args){
       newtestOrder();
   }
}
classTestA{
   publicTestA(){
       System.out.println("Test--A");
   }
}
classTestB{
   publicTestB(){
       System.out.println("Test--B");
   }
}
classTestC{
   publicTestC(){
       System.out.println("Test--C");
   }
}

结果显示:
Test--A
Test--B
静态初始化块
Test--C
inconstract

个人总结:
先静后动,先父后子,从上到下,先变量后构造