<div class="con editor-preview-side" id="result" data-version="1"><div class="editor-container container am-engine" id="container" data-element="root"><p><br></p><p>一、<strong>对象的初始化顺序</strong></p><p>(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的)</p><p> 1.为父类的静态属性分配空间并赋于初值</p><p> 1.执行父类静态初始化块;</p><p>(2)加载子类</p><p> 2.为子类的静态属性分配空间并赋于初值</p><p> 2.执行子类的静态的内容;</p><p>(3)加载父类构造器</p><p> 3.初始化父类的非静态属性并赋于初值</p><p> 3.执行父类的非静态代码块;</p><p> 4.执行父类的构造方法;</p><p>(4)加载子类构造器</p><p> 5.初始化子类的非静态属性并赋于初值</p><p> 5.执行子类的非静态代码块;</p><p> 6.执行子类的构造方法.</p><p>总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。</p><p>二、<strong>静态变量和静态代码块的初始化顺序</strong>:</p><p> 谁在前面先初始化谁(这个也比较容易理解,初始化的时候,不可能跳着去初始化吧,比如说静态代码块在静态变量的前面,不可能先跳过静态代码块的初始化先去执行静态变量的初始化吧。)</p><p>注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用</p><p>父类带参数的构造方法,否则编译不能通过。</p><p> </p><p> </p><p> <strong>三、类装载步骤</strong> </p><p> </p><p> </p><p> 在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: </p><p> </p><p> </p><p> 装载:查找和导入类或接口的二进制数据; </p><p> </p><p> </p><p> 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; </p><p> </p><p> </p><p> 校验:检查导入类或接口的二进制数据的正确性; </p><p> </p><p> </p><p> 准备:给类的静态变量分配并初始化存储空间; </p><p> </p><p> </p><p> 解析:将符号引用转成直接引用; </p><p> </p><p> </p><p> 初始化:激活类的静态变量的初始化Java代码和静态Java代码块。 </p><p> </p><p> </p><p> 初始化类中属性是静态代码块的常用用途,但只能使用一次。 </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> <strong>对象的初始化顺序测试代码</strong> </p><p> </p><p> </p><p> </p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194626_64e1fd12eb50126073.gif" alt="java 静态类 初始化 java静态对象初始化_父类" style="visibility: visible; width: 11px;"></p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194627_64e1fd130907b43101.gif" alt="java 静态类 初始化 java静态对象初始化_java 静态类 初始化_02" style="visibility: visible; width: 11px;"></p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_0" class="copy_btn disable">登录后复制</button> <a title="登录后一键下载全文代码" class="downloadCode"><i class="iconblog blogimport "></i></a> </div><pre class="language-plain prettyprint" tabindex="0"><code class="language-plain has-numbering" id="code_id_0"> StaticIniBlockOrderTest class Parent { static String name = " hello " ; { System.out.println( " parent block " ); } static { System.out.println( " parent static block " ); }
public Parent() { System.out.println( " parent constructor " ); } }
class Child extends Parent { static String childName = " hello " ; { System.out.println( " child block " ); } static { System.out.println( " child static block " ); }
public Child() { System.out.println( " child constructor " ); } }
public class StaticIniBlockOrderTest {
public static void main(String[] args) { new Child(); // 语句(*) } }</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li><li>12.</li><li>13.</li><li>14.</li><li>15.</li><li>16.</li><li>17.</li><li>18.</li><li>19.</li><li>20.</li><li>21.</li><li>22.</li><li>23.</li><li>24.</li><li>25.</li><li>26.</li><li>27.</li><li>28.</li><li>29.</li><li>30.</li><li>31.</li><li>32.</li><li>33.</li><li>34.</li><li>35.</li></ul></pre></div><div class="toolbar"></div></div></div><p> </p><p> 运行结果: </p><p> </p><p> </p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_1" class="copy_btn disable">登录后复制</button> <a title="登录后一键下载全文代码" class="downloadCode"><i class="iconblog blogimport "></i></a> </div><pre class="language- language-none prettyprint" tabindex="0"><code class="language-none has-numbering" id="code_id_1">parent static block child static block parent block parent constructor child block child constructor</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li></ul></pre></div><div class="toolbar"></div></div></div><p> </p><p> </p><p> <strong>静态变量和静态代码块的初始化顺序测试代码</strong> </p><p> </p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194626_64e1fd12eb50126073.gif" alt="java 静态类 初始化 java静态对象初始化_父类" style="visibility: visible; width: 11px;"></p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194627_64e1fd130907b43101.gif" alt="java 静态类 初始化 java静态对象初始化_java 静态类 初始化_02" style="visibility: visible; width: 11px;"></p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_2" class="copy_btn disable">登录后复制</button> <a title="登录后一键下载全文代码" class="downloadCode"><i class="iconblog blogimport "></i></a> </div><pre class="language-plain prettyprint" tabindex="0"><code class="language-plain has-numbering" id="code_id_2"> TestOrder public class TestOrder { // 静态变量 public static TestA a = new TestA();
// 静态初始化块 static { System.out.println( " 静态初始化块 " ); }
// 静态变量 public static TestB b = new TestB();
public static void main(String[] args) { new TestOrder(); } }
class TestA { public TestA() { System.out.println( " Test--A " ); } }
class TestB { public TestB() { System.out.println( " Test--B " ); } }</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li><li>12.</li><li>13.</li><li>14.</li><li>15.</li><li>16.</li><li>17.</li><li>18.</li><li>19.</li><li>20.</li><li>21.</li><li>22.</li><li>23.</li><li>24.</li><li>25.</li><li>26.</li><li>27.</li><li>28.</li><li>29.</li></ul></pre></div><div class="toolbar"></div></div></div><p> 运行结果: </p><p> Test--A </p><p> 静态初始化块 </p><p> Test--B</p><p>再加一个经典的测试代码</p><p> </p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_3" class="copy_btn disable">登录后复制</button> <a title="登录后一键下载全文代码" class="downloadCode"><i class="iconblog blogimport "></i></a> </div><pre class="language-plain prettyprint" tabindex="0"><code class="language-plain has-numbering" id="code_id_3">package static测试;
class insect{ int i=9; int j;
static { prt("static block first,because it's begin of the static variable"); } insect(){ System.out.println("insect initialized");
prt("i= "+i+" j="+j);
j=39;
}
static int x1=prt("static insect x1 initialized");
static int prt(String s){
System.out.println(s);
return 47;
}
}
public class Wps extends insect{ Wps(){ System.out.println("wps initialized");
prt("k="+k);
prt("j="+j);
} int k=prt("the member k in wps be initialized");
static int x2=prt("static wps x2 initialized");
static int prt(String s){
System.out.println(s);
return 63;
}
public static void main(String[] args){
insect.prt("initialized constructor");
// Wps w=new Wps();
}
}</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li><li>12.</li><li>13.</li><li>14.</li><li>15.</li><li>16.</li><li>17.</li><li>18.</li><li>19.</li><li>20.</li><li>21.</li><li>22.</li><li>23.</li><li>24.</li><li>25.</li><li>26.</li><li>27.</li><li>28.</li><li>29.</li><li>30.</li><li>31.</li><li>32.</li><li>33.</li><li>34.</li><li>35.</li><li>36.</li><li>37.</li><li>38.</li><li>39.</li><li>40.</li><li>41.</li><li>42.</li><li>43.</li><li>44.</li><li>45.</li><li>46.</li><li>47.</li><li>48.</li><li>49.</li><li>50.</li><li>51.</li><li>52.</li><li>53.</li><li>54.</li><li>55.</li><li>56.</li><li>57.</li><li>58.</li><li>59.</li><li>60.</li><li>61.</li><li>62.</li></ul></pre></div><div class="toolbar"></div></div></div><p> </p><p> </p><p> </p><p><br></p></div></div>