1. 程式人生 > >一個小例子解釋類載入的過程

一個小例子解釋類載入的過程

初始化和類的載入

類的程式碼在初次使用時才會載入,這通常是指載入發生在建立類的第一個物件的時候,但是,當訪問static域或者呼叫了此類的static方法,也會載入。構造器也是static方法,所以總之來說,類是在其任何static成員被訪問的時候被載入的。

一個Java類A執行的時候,所發生的第一件事就是試圖去訪問A的main方法,於是載入器會開始啟動並找到A.class檔案,在載入的時候會找A是否有父類物件,如果存在父類,假設為B。那麼會繼續載入,不管是否準備建立一個B的物件。

如果B還有父類,會繼續向上載入,如此類推。接下來,會進行根基類的static初始化,然後是下一個子類。這樣做的原因是為了子類的初始化可能會依賴於父類成員能否被正確初始化。static程式碼包括static程式碼塊會按照在類裡面的順序依次載入。
到這裡,必要的類都已經載入完了,可以建立物件了。此時,物件中的所有基本型別都會被設定為預設值,物件引用會被設定為null。然後,呼叫根基類的構造器(如果有構造程式碼塊先呼叫程式碼塊),在基類的構造期完成以後,例項變數也會按照次序被初始化。例如下面的程式碼,如果打上斷點,看看類載入的順序,應該就差不多了。

package chapter7;

public class TestLoadSequence {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a);
    }
}


class A extends B {
    static int i = 5;
    int val;
    String s;
    static {
        System.out.println("static A");
        System.out.println("static initialization i = "
+ i); System.out.println("static initialization j = " + j); i = 6; j = 99; } public A() { System.out.println("constructor A"); System.out.println("constructor A: i is " + i); System.out.println("constructor A: j is " + j); System.out.println("constructor A: val is "
+ val); System.out.println("constructor A: String is " + s); } { System.out.println("val is " + val); System.out.println("String is " + s); val = 1; s = "default"; } public static void main(String[] args) { System.out.println("A main"); } } class B { static { System.out.println("static B"); int j = 5; System.out.println("static initialization j = " + j); } static int j = 6; public B() { System.out.println("constructor B"); System.out.println("constructor B: j is " + j); } } /* output: static B static initialization j = 5 static A static initialization i = 5 static initialization j = 6 constructor B constructor B: j is 99 val is 0 String is null constructor A constructor A: i is 6 constructor A: j is 99 constructor A: val is 1 constructor A: String is default chapter7.A[email protected] *

相關推薦

一個例子解釋載入過程

初始化和類的載入 類的程式碼在初次使用時才會載入,這通常是指載入發生在建立類的第一個物件的時候,但是,當訪問static域或者呼叫了此類的static方法,也會載入。構造器也是static方法,所以總之來說,類是在其任何static成員被訪問的時候被載入的。

Nightmare安裝and一個例子

lob user tor driver .cn earch .org var query 前端的功能測試 功能測試必須在真正瀏覽器做,現在有四種方法。 使用本機安裝的瀏覽器 使用 Selenium Driver 使用 Headless Chrome 使用 Electr

支持向量機(SVM)的一個例子

EDA 由於 pda 其它 oca 測試數據 tempdata data before clc; clear; N=10; %下面的數據是我們實際項目中的10訓練樣例(樣例中有8個屬性) %一個正例九個負例 correctData=[0,0.2,0.8,0,0,0,2,2

vue一個例子

vue 的一個例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <s

JVM總括四-載入過程、雙親委派模型、物件例項化

JVM總括四-類載入過程、雙親委派模型、物件例項化 一、 類載入過程 一定要注意每個過程執行的內容!!!!!! 1、Load:   將編譯後的.class檔案以二進位制流的方式載入到JVM記憶體中,並轉化為特定的資料結構,用到的就是classLoad二類載入器。這個過程中校驗cafe babe

單節點k8s的一個例子 webapp+mysql

安裝kubernetes 準備一臺centos7 1) 關閉firewalld 和 selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 2)安裝etcd和kubernetes yum install

JVM總括四-載入過程、雙親委派模型、物件例項化過程 JVM思考-init和clinit區別

JVM總括四-類載入過程、雙親委派模型、物件例項化過程 目錄:JVM總括:目錄 一、 類載入過程 類載入過程就是將.class檔案轉化為Class物件,類例項化的過程,(User user = new User(); 這個過程是物件例項化的過程); 一個.class檔案只有一個Class物件(位元

JVM思考-init和clinit區別 JVM總括四-載入過程、雙親委派模型、物件例項化過程

JVM思考-init和clinit區別 目錄:JVM總括:目錄 clinit和init的區別其實也就是Class物件初始化物件初始化的區別,詳情看我上一篇部落格:  JVM總括四-類載入過程、雙親委派模型、物件例項化過程 一、init和clinit方法執行時機不同   init是物件構

JVM總括四-載入過程、雙親委派模型、物件例項化過程

JVM總括四-類載入過程、雙親委派模型、物件例項化過程 目錄:JVM總括:目錄 一、 類載入過程 類載入過程就是將.class檔案轉化為Class物件, 類例項化 的過程 ,(User user = new User(); 這個過程是 物件例項化 的

強大的php | 跟ajax混合的一個例子|驗證這樣可用來著

$.ajax({ type:'POST', cache:false, url:"<?=Yii::$app->urlManager->createUrl('/Zhaopin/interviewer/getdutylist/'); ?>", data:

使用Trinity拼接以及分析差異表達一個例子

使用Trinity拼接以及分析差異表達一個小例子  2017-06-12 09:42:47     293     0     0 Trinity 將測序資料

深入淺出地理解springmvc及第一個例子

Spring MVC框架是有一個MVC框架,通過實現Model-View-Controller模式來很好地將資料、業務與展現進行分離。從這樣一個角度來說,Spring MVC和Struts、Struts2非常類似。Spring MVC的設計是圍繞DispatcherS

一個簡單例子解釋工廠模式建立物件

function createObject(name,age) { var obj=new Object(); obj.name=name; obj.age=age; obj.eat=function () { console.log(

Java載入過程及static詳解

類從被載入到JVM中開始,到解除安裝為止,整個生命週期包括:載入、驗證、準備、解析、初始化、使用和解除安裝七個階段。 其中類載入過程包括載入、驗證、準備、解析和初始化五個階段。   類載入器的任務就是根據一個類的全限定名來讀取此類的二進位制位元組流到JVM中,然後轉換為一個與目

java虛擬機器載入過程(精簡版)

java虛擬機器類載入過程步驟:     1.載入 將虛擬機器外部的二進位制位元組流儲存到方法區中: a.獲取此類二進位制流: 通過一個類的全限定名來獲取定義此類的二進位制流; b.資料結構轉化: 將位元組流所代表的靜態儲存結

Java的載入過程

一個Java檔案從編碼完成到最終執行,一般主要包括兩個過程:編譯與執行。編譯即將Java檔案通過Javac命令生成.class檔案的過程,執行就是將.class檔案交給JVM進行執行。 類載入過程即是指JVM虛擬機器把.class檔案中類資訊載入進記憶體,並進行解析生成對應的class物件的過程。JVM在執行

使用純虛擬函式的一個細節——派生定義該虛擬函式時宣告語句必須與基裡完全一致

純虛擬函式在派生類裡明明補寫出來了定義,但是實際發現是無效的,派生類因沒有定義該純虛擬函式同樣被編譯器視為了抽象類。 原因很有可能是:基類和派生類的虛擬函式必須型別、名字、引數數量、名字、型別、以及函式前後綴的各種其他屬性(比如const等)必須完全一致!否則會被認為不是同

Java載入過程&&靜態程式碼塊的初始化過程

問題的引入        還是老規矩,先說說自己遇到的問題。 最近看到了一個比較有意思的Java程式,初次看到這段程式執行的結果還是挺讓我意外的,話不多說先上程式,大家也可以揣摩一下(大神自行略過......) class Singleton{

載入過程(clinit()),物件例項化過程(init())

類載入過程: 1、類載入就是執行Java程式編譯之後在位元組碼檔案中生成的clinit()方法(稱之為類構造器),clinit()方法由靜態變數和靜態程式碼塊組成。 2、子類的載入首先需要先載入父類,如果父類為介面。則不會呼叫父類的clinit方法。一個類中可以沒有clinit方法。 3、clinit方

Java載入過程 ——Thinking in Java學習筆記(六)

java中一個類從被載入開始,一直到被銷燬為止,類的整個生命週期包括:載入、驗證、準備、解析、初始化、使用和解除安裝七個階段。 其中,類載入過程包括載入、驗證、準備、解析、初始化,其中,驗證、準備、解析又被合稱為連線過程。 1、載入階段 載入過程的主要工作有: