国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 10:43:59
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑水县| 玛曲县| 沽源县| 蕉岭县| 灯塔市| 伊宁市| 徐闻县| 锡林浩特市| 全州县| 辽阳县| 饶平县| 宝鸡市| 金沙县| 苍溪县| 屯昌县| 微山县| 红桥区| 通化市| 任丘市| 招远市| 井陉县| 蚌埠市| 永州市| 青浦区| 蕉岭县| 沾益县| 民勤县| 吕梁市| 安远县| 平顶山市| 永平县| 新沂市| 建湖县| 资阳市| 公安县| 安多县| 高淳县| 东乌珠穆沁旗| 常州市| 吴堡县| 北宁市|