java 静态类 初始化 java静态对象初始化

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章