java對象的初始化
我們知道一個對象可以有靜態變量、變量、靜態初始化塊、初始化塊,當我們創建一個對象時,它是怎麼初始化的呢?按什麼順序初始化的呢?
- public class Test {
- // 靜態變量
- public static String staticField = "靜態變量"; // 變量
- public String field = "變量";
- // 靜態初始化塊
- static {
- System.out.println(staticField);
- System.out.println("靜態初始化塊");
- }
- // 初始化塊
- {
- System.out.println(field);
- System.out.println("初始化塊");
- }
- // 構造器
- public Test() {
- System.out.println("構造器");
- }
- public static void main(String[] args) {
- Test test = new Test();
- }
- }
- public class Test {
- public static TestA ta = new TestA();
- // 靜態變量
- public static String staticField = "靜態變量"; // 變量
- public String field = "變量";
- // 靜態初始化塊
- static {
- System.out.println(staticField);
- System.out.println("靜態初始化塊");
- }
- // 初始化塊
- {
- System.out.println(field);
- System.out.println("初始化塊");
- }
- // 構造器
- public Test() {
- System.out.println("構造器");
- }
- public static void main(String[] args) {
- Test test = new Test();
- }
- }
- class TestA {
- public TestA() {
- System.out.println("Test--A");
- }
- }
Test--A
靜態變量
靜態初始化塊
變量
初始化塊
構造器
再換下位置,把static TestA ta = new TestA()放到在靜態初始化塊後,我們發現輸出是:
- public class Test extends Parent{
- // 靜態變量
- public static String staticField = "子類靜態變量"; // 變量
- public String field = "子類變量";
- // 靜態初始化塊
- static {
- System.out.println(staticField);
- System.out.println("子類靜態初始化塊");
- }
- //public static TestA ta = new TestA();
- // 初始化塊
- {
- System.out.println(field);
- System.out.println("子類初始化塊");
- }
- // 構造器
- public Test() {
- System.out.println("子類構造器");
- }
- public static void main(String[] args) {
- Test test = new Test();
- }
- }
- class Parent{
- public String field = "父類變量";// 變量
- public static String staticField = "父類靜態變量"; // 靜態變量
- // 靜態初始化塊
- static {
- System.out.println(staticField);
- System.out.println("父類靜態初始化塊");
- }
- // 初始化塊
- {
- System.out.println(field);
- System.out.println("父類初始化塊");
- }
- // 構造器
- public Parent() {
- System.out.println("父類構造器");
- }
- }
大家就test2的初始化又如何?
輸出結果:
父類靜態變量
父類靜態初始化塊
子類靜態變量
子類靜態初始化塊
父類變量
父類初始化塊
父類構造器
子類變量
子類初始化塊
子類構造器
***********
父類變量
父類初始化塊
父類構造器
子類變量
子類初始化塊
子類構造器
***********
發現什麼了?
2、父類>子類
二、靜態變量和靜態代碼塊只加載一次,因爲它們是全局共享的