国产探花免费观看_亚洲丰满少妇自慰呻吟_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");
  }在類別第一次使用而載入時執行,且只執行一次。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普安县| 桦甸市| 成安县| 陈巴尔虎旗| 鹤山市| 苗栗市| 泰宁县| 剑阁县| 马龙县| 克东县| 云安县| 乌鲁木齐市| 共和县| 霍林郭勒市| 庆阳市| 福安市| 安塞县| 子长县| 南安市| 绿春县| 巴彦淖尔市| 枣强县| 茂名市| 海淀区| 建水县| 邢台县| 泸溪县| 斗六市| 丹阳市| 巴南区| 藁城市| 额济纳旗| 巫溪县| 鄢陵县| 桂东县| 南城县| 安新县| 县级市| 海门市| 百色市| 石柱|