1. 程式人生 > >java 中類初始化,構造方法,靜態成員變數,靜態塊的載入順序

java 中類初始化,構造方法,靜態成員變數,靜態塊的載入順序

1、編譯和執行概念要搞清:編譯即javac的過程,負責將.java檔案compile成.class檔案,主要是型別、格式檢查與編譯成位元組碼檔案,而載入是指java *的過程,將.class檔案載入到記憶體中去解釋執行,即執行的時候才會有載入一說。

2、類的載入時機,肯定是在執行時,但並不是一次性全部載入,而是按需動態,依靠反射來實現動態載入,一般來說一個class只會被載入一次,之後就會從jvm的class例項的快取中獲取,誰用誰取就可以了,不會再去檔案系統中載入.class檔案了。

java虛擬機器規範雖然沒有強制性約束在什麼時候開始類載入過程,但是對於類的初始化,虛擬機器規範則嚴格規定了有且只有四種情況必須立即對類進行初始化,遇到new、getStatic、putStatic或invokeStatic這4條位元組碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。
生成這4條指令最常見的java程式碼場景是:

1)使用new關鍵字例項化物件

2)讀取一個類的靜態欄位(被final修飾、已在編譯期把結果放在常量池的靜態欄位除外)

3)設定一個類的靜態欄位(被final修飾、已在編譯期把結果放在常量池的靜態欄位除外)

4)呼叫一個類的靜態方法

簡單來說就是第一次使用一個類時。

初始化一個類的執行順序:

如果類還沒有被載入:
1、先執行父類的靜態程式碼塊和靜態變數初始化,並且靜態程式碼塊和靜態變數的執行順序只跟程式碼中出現的順序有關。
2、執行子類的靜態程式碼塊和靜態變數初始化。
3、執行父類的例項變數初始化(例如:int a;初始化就是0,引用型別就是null)
4、執行父類的建構函式
5、執行子類的例項變數初始化(例如:int a;初始化就是0,引用型別就是null)
6、執行子類的建構函式
如果類已經被載入:
則靜態程式碼塊和靜態變數就不用重複執行,再建立類物件時,只執行與例項相關的變數初始化和構造方法。

驗證:

public class StaticTest {
    public static void main(String[] args) {
        new Abc();
    }
}


class Abc{
    public static Bcd i = new Bcd();
    static{
        int b = 2;
        System.out.println("=====靜態塊======");
    }


    Abc(){
        System.out.println("======構造方法=========");
    }

    public
static void c(){ System.out.println("==========靜態方法==========="); } } class Bcd{ Bcd(){ System.out.println("======靜態成員變數========"); } }

執行結果:
這裡寫圖片描述

相關推薦

java 初始構造方法靜態成員變數靜態載入順序

1、編譯和執行概念要搞清:編譯即javac的過程,負責將.java檔案compile成.class檔案,主要是型別、格式檢查與編譯成位元組碼檔案,而載入是指java *的過程,將.class檔案載入到記憶體中去解釋執行,即執行的時候才會有載入一說。 2、類的載

java初始時機

java虛擬機器規範雖然沒有強制性約束在什麼時候開始類載入過程,但是對於類的初始化,虛擬機器規範則嚴格規定了有且只有四種情況必須立即對類進行初始化,遇到new、getStatic、putStatic或invokeStatic這4條位元組碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。 生成這

Java靜態初始例項初始以及構造方法

首先有三個概念需要了解: 一.靜態初始化:是指執行靜態初始化塊裡面的內容。 二.例項初始化:是指執行例項初始化塊裡面的內容。 三.構造方法:一個名稱跟類的名稱一樣的方法,特殊在於不帶返回值。 我們先來看一段程式結果:package com; class Book{

java如何使用空參構造方法自動生成不同名字的對象使用非靜態的屬性和靜態屬性有什麽區別原因是什麽?如何理解static關鍵字

區別 關鍵字 內部 方法 屬性 count per setname person 空參構造自動生成對象時,使用非靜態的屬性 代碼: package com.swift; //使用無參構造方法自動生成對象,序號不斷自增 public class Person { p

Java初始構造器的執行順序

我們都知道java中不但有構造器,還有初始化塊和靜態初始化塊的概念,今天我們就來看看他們之間的執行順序是怎樣的。 我們來看一個例子: package test; class Root { static { System.out.println("Root的靜態初始化塊"); }

Java靜態成員變數靜態程式碼靜態內部類何時被初始

關於這個問題,本文不扯理論,直接上程式碼,通過結果來驗證結論,廢話少說,測試程式碼如下: public class StaticTest { public static StaticMember staticMember = new Static

python2python3子呼叫父初始函式的方法和注意事項

python2、python3: python子類呼叫父類初始化函式有兩種方式,以下程式碼在python2和python3都能執行: class A(object): def __init__(self, x): self.x = x # 方法

Java程序初始順序

int() 測試 subclass ini 透明 turn views 是我 輸出 1,在一個類的內部(不考慮它是另一個類的派生類):很多人認為,類的成員變量是在構造方法調用之後再初始化的,先不考慮這種觀點的正確性,先看一下下面的代碼: [java] view pl

Java HashMap 初始時賦值

lec SM 解決 道理 test ack 增加 數據結構 解決辦法 1、HashMap 初始化的文藝寫法HashMap 是一種常用的數據結構,一般用來做數據字典或者 Hash 查找的容器。普通青年一般會這麽初始化:HashMap<String, S

初始構造初始的區別

zed ali ati ise reat div cto 練習 diff // initialization/ConstructorTest2.java // TIJ4 Chapter Initialization, Exercise 2, p158 /* Create

Java的比較與排序方法(應用Comparable介面與Comparator介面)

引言 在平時寫Java的程式的時候,如果要進行一些基本型別的變數的比較,可以很方便得呼叫’Math.max()’、Math.min()等方法,如果要對陣列或者列表進行排序,也可以用Arrays.sort()和Collections.sort()等已經封裝好的方法來進行。但是,如果是一個自

Java初始過程

Java中變數初始化順序: 1.靜態變數在類載入時初始化 2.將分配給物件的儲存空間初始化成二進位制的0,即先將所有的非靜態成員變數初始化成0 3.如果有父類,先呼叫父類構造方法 4.按照宣告的順序呼

Java-為什麼非靜態內部類裡面不能定義靜態方法靜態成員變數靜態初始

首先要明確一點: static修飾方法、成員變數是屬於類自己的。並不屬於特定的某個物件。所以我們可以像這樣使用static修飾的方法、變數:ClassName.methodName、ClassName

static程式碼成員變數初始構造方法執行順序

下面程式碼: public class Son{ Father father = new Father(); static{ System.out.println("Son static"); } publi

JAVA陣列初始時用new與不用new有區別嗎

不同於String類,String由於實現了常量池 所以new 和不new 有區別:new的話,引用變數指向堆區。不new的話,引用變數指向常量池。對於陣列的定義,初始化時用new與不用new 沒區別,

java初始(建構函式和innt函式)

        先說一下什麼是初始化,就是在最開始給成員變數一個初始的值,這個時候你就會問了,既然後面還要給它賦值為什麼要給它初始化呢,不是多此一舉麼,首先這個初始化是為了防止程式執行時候出現未知的錯誤,或者bug。        初始化一般在建構函式中進行,它定義了函式的初

java中子初始流程(包括靜態區和非靜態區)

一. 類中的方法分為例項方法和類方法兩種,用static修飾的是類方法。二者有什麼區別呢? 例項方法:        當類的位元組碼檔案被載入到記憶體時,類的例項方法不會被分配入口地址,當該類建立物

Java通過this關鍵字呼叫構造方法的一些理解

  學習java時,理解的this關鍵字的實質是用來指向當前物件的一個指標。按照之前所學,理解它有以下三種用法加一個性質。1.在構造方法中使用this       關鍵字this可以出現在類的構造方法中,代表使用該構造方法所建立的物件。public class Tom {

java初始靜態

java語言中的初始化塊 1、什麼是初始化塊? 在一個類中,用來對例項變數作初始化的語句塊。2、初始化塊在何時被執行? 它在每一次構造物件時被執行且比構造器先執行。3、對例項變數做初始化有三種方式? 1) 通過構造器實現初始化。 2) 在定義例項變數時就給它一個值。 3)

關於JAVAArrays一些說明及方法

Class Arrays java.util.Arrays public class Arrays extends Object 該類包含用於運算元組的各種方法(如排序和搜尋)。 該類還包含一個