熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java 類中類屬性和對象屬性的初始化順序

2013-11-23 19:11:04  來源: Java核心技術 

  Java 類中類屬性 (static 變量) 和對象屬性 (非 static 變量) 的初始化順序可以用如下程序測試
  
  /**
  * @(#) Testjava
  * @author fancy
  */
  
  public class Test {
  
  static String a = stringa;
  static String b;
  
  String c = stirngc;
  String d;
  
  static {
  printStatic(before static);
  b = stringb;
  printStatic(after static);
  }
  
  public static void printStatic(String title) {
  Systemoutprintln( + title + );
  Systemoutprintln(a = \ + a + \);
  Systemoutprintln(b = \ + b + \);
  }
  
  public Test() {
  print(before constructor);
  d = stringd;
  print(after constructor);
  }
  
  public void print(String title) {
  Systemoutprintln( + title + );
  Systemoutprintln(a = \ + a + \);
  Systemoutprintln(b = \ + b + \);
  Systemoutprintln(c = \ + c + \);
  Systemoutprintln(d = \ + d + \);
  }
  
  public static void main(String[] args) {
  new Test();
  }
  
  }
  
  首先我把 main() 方法注釋掉運行結果如下
  
  before static
  a = stringa
  b = null
  after static
  a = stringa
  b = stringb
  javalangNoSuchMethodError: main
  Exception in thread main
  Process completed
  
  然後取消對 main() 方法的注釋運行結果如下
  
  before static
  a = stringa
  b = null
  after static
  a = stringa
  b = stringb
  before constructor
  a = stringa
  b = stringb
  c = stirngc
  d = null
  after constructor
  a = stringa
  b = stringb
  c = stirngc
  d = stringd
  
  由此可以看出 Java 類屬性和對象屬性的初始化順序如下
  
  ① 類屬性 (靜態變量) 定義時的初始化如上例的 static String a = stringa;
  ② static 塊中的初始化代碼如上例 static {} 中的 b = stringb;
  ③ 對象屬性 (非靜態變量) 定義時的初始化如上例的 String c = stirngc;
  ④ 構造方法 (函數) 中的初始化代碼如上例構造方法中的 d = stringd;
  
  在此過程中 ② 和 ③ 的順序無所確定因為在靜態塊中無法打印出非靜態變量同樣是因為這個原因知道他們的順序對我們寫程序也毫無幫助再因為類成員 (靜態成員) 是在第一次使用到類的時候就進行了相應的初始化而對象成員 (非靜態成員) 則需要生成類實例 (即對象) 時才能初始化所以我把 ③ 排在了 ② 的後面再申明一次它們究竟誰先誰後從代碼上是不能確定的恐怕需要去研究一下 JVM (Java 虛擬機) 的執行過程才行
  
  
  以下是一些回帖的討論
  我對狂人教程對象成員 (非靜態成員) 則需要生成類實例 (即對象) 時才能初始化有些看法!例如你在例程中定義的兩個對象成員變量String c = stirngc;
  String d;我認為當程序執行這個Test類的時候成員變量(不包括構造函數)和類成員變量一樣都要裝載到內存這樣對象成員變量就可以被構造函數所調用但是究竟靜態變量和非靜態變量哪個先執行可以看在代碼中的先後順序但是這對於編寫代碼來說並沒有多大的用處!
  
  static
  {
  printStatic(before static);
  b = stringb;
  printStatic(after static);
  }在類別第一次使用而載入時執行且只執行一次
  caterpillar
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26404.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.