1. 程式人生 > >Java類的載入、連結和初始化(個人筆記)

Java類的載入、連結和初始化(個人筆記)

這裡看到一篇比較好的文章:http://www.infoq.com/cn/articles/cf-Java-class-loader

這裡只是針對什麼時候會觸發java類的初始化(注意:這裡不是說的例項化)進行討論:

除了文章中提到的5點:

  • 建立一個Java類的例項。如
    MyClass obj = new MyClass()
  • 呼叫一個Java類中的靜態方法。如
    MyClass.sayHello()
  • 給Java類或介面中宣告的靜態域賦值。如
    MyClass.value = 10
  • 訪問Java類或介面中宣告的靜態域,並且該域不是常值變數。如
    int value = MyClass.value
  • 在頂層Java類中執行assert語句。
  • 通過Java反射API也可能造成類和介面的初始化

這裡我想說明一下final static修飾的欄位(情況一共分為3種):

第一種(類不會被初始化):

public final static String a = "abc";

第二種(類會被初始化):

public final static String a;
static{
   a = "abc"  
}

第三種(類會被初始化):

public final static String a = new String("abc");

這裡還是借用文章中的一句話:

"非常量賦值的final域以及靜態塊中初始化的final域被訪問都會導致類的初始化;其他常量賦值的final域被訪問則不是,我估計著它會在類的連結階段就被初始化了。"

下面是測試的程式碼:

public class TestClassLoader {
    public final static String a = "abc";
    //public final static String a = new String("abc");
    static {
        //a = "abc";
        System.out.println("類被初始化了");
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println(TestClassLoader.a);
    }
}

相關推薦

Java載入連結初始個人筆記

這裡看到一篇比較好的文章:http://www.infoq.com/cn/articles/cf-Java-class-loader 這裡只是針對什麼時候會觸發java類的初始化(注意:這裡不是說的例項化)進行討論: 除了文章中提到的5點: 建立一個Java類的例項。如 MyClass obj =

Java載入連結初始

 Java位元組程式碼的表現形式是位元組陣列(byte[]),而Java類在JVM中的表現形式是java.lang.Class類 的物件。一個Java類從位元組程式碼到能夠在JVM中被使用,需要經過載入、連結和初始化這三個步驟。這三個步驟中,對開發人員直接可見的是Jav

JVM之——載入連結初始

本文我們一起討論Java類的載入、連結和初始化。 Java位元組程式碼的表現形式是位元組陣列(byte[]),而Java類在JVM中的表現形式是 java.lang.Class類 的物件。一個Java類從位元組程式碼到能夠在JVM中被使用,需要經過載入、連結和初始化這三個步驟

【JVM】載入連線初始過程

程式執行時,載入類主要經過3個階段分別是類的載入,連線和初始化。分別介紹一下這三個過程。 一、載入 類的載入指的是將類的.class檔案中二進位制資料讀入到記憶體中,將其放在執行時資料區的方法區內,然後在堆區建立一個 java.lang.Class物件

Java學習——載入連線初始

JVM和類   當呼叫java命令執行某個java程式時,該命令將會啟動一個java虛擬機器程序,同一個JVM裡的所有執行緒、所有變數都處於同一個程序裡,他們都使用該JVM程序的記憶體區。       當系統出現以下幾種情況時,JVM程序將被終止。    ->程式執行到最後正

JVM初探——載入連線初始

一、載入類的載入就是查詢並載入類的二進位制資料。最常見的情況就是將一個已經存在在磁碟的 .class 檔案載入到記憶體中。類的載入指的是將類的 .class 檔案中的二進位制資料讀入到記憶體中,將其放在執行時資料區的方法區內,然後在記憶體中建立一個java.lang.Clas

latex公式圖片表格的插入。個人筆記

注意:公式可能要用到 amsmath 巨集 1、單個公式自動標號 \begin{equation} \label{eq3} e(f) = E\left | X(f)-\tilde{X}(f

Java一維陣列定義初始二維陣列定義初始傳參方式Arrays

陣列 陣列是Java中的一種資料型別,是一組資料的集合,陣列中的每個成員稱為元素。Java中的陣列是類型別(引用型別),Java的同一個陣列中,只能存放相同型別的資料元素。 一維陣列 一維陣列的定義方式 一維陣列有以下兩種定義方式,推薦使用第一種定義方式 <資料型別

JAVA載入連線與初始

JAVA類的載入、連線與初始化 類的宣告週期總共分為5個步驟1、載入2、連線3、初始化4、使用5、解除安裝 當java程式需要某個類的時候,java虛擬機器會確保這個類已經被載入、連線和初始化,而連線這個類的過程分為3個步驟 1、 載入:查詢並載入這個類的二進位制資料 類的

JVM詳解之:載入連結初始

[toc] # 簡介 有了java class檔案之後,為了讓class檔案轉換成為JVM可以真正執行的結構,需要經歷載入,連結和初始化的過程。 這三個過程是怎麼工作的呢?在本文中你將會找到答案。 # 載入 JVM可以分為三大部分,五大空間和三大引擎,要講起來也不是特別複雜,先看下面的總體的JVM架

Java自定義陣列的建立初始

  剛剛在慕課學習Java的集合類List過程中,向集合中新增元素時,遇到一個問題: 定義了一個Course類; public class Course { private String id; private String n

載入器 - 載入連線與初始

類的載入、連線與初始化 概述 在Java程式碼中,型別的載入、連線與初始化過程都是在程式執行期間完成的 型別:可以理解為一個class 載入:查詢並載入類的二進位制資料,最常見的情況是將已經編譯完成的類的class檔案從磁碟載入到記憶體中 連線:確定型別與型別之間的關係,對於位元組碼的相關處理 驗證:確保

java的加載與初始總結

name 重復 構造器 存儲空間 iii 成員變量 垃圾處理 創建 遞歸 1、觸發類加載的原因(主動調用與被動調用):     六種主動調用:       1)、創建類的實例(new操作、反射、cloning、反序列化)       2)、調用類的靜態方法       3)

java 的成員之四 初始程式碼塊(程式碼塊)的使用

java 類的成員之四 初始化程式碼塊(程式碼塊)的使用 1.java類的成員有四個 2.非static(非靜態)程式碼塊(初始化塊)的使用 3.static(靜態)程式碼塊(初始化塊)的使用 4.java初始化塊面試題

Java構造方法成員變數初始以及靜態成員變數初始三者的先後順序是什麼樣的?

【Java筆試真題】:構造方法、成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的? 【解答】: 當類第一次被載入的時候,靜態變數會首先初始化,接著編譯器會把例項變數初始化為預設值,然後執行構造方法。 Java程式的初始化一般遵循以下三個原則(以下三原則優先順序依次遞減): ①

Java一維陣列定義初始

陣列 陣列是Java中的一種資料型別,是一組資料的集合,陣列中的每個成員稱為元素。Java中的陣列是類型別(引用型別),Java的同一個陣列中,只能存放相同型別的資料元素。 一維陣列 一維陣列的定義方式 一維陣列有以下兩種定義方式,推薦使用第一種定義方式 &l

C++例項---虛基的建構函式初始

執行環境:macOS shell 程式碼: #include <iostream> #include <iomanip> #include <string> using namespace std; class base

OPTEE學習筆記 - 驅動的載入初始CATA通訊

驅動的載入和初始化可以參考https://blog.csdn.net/shuaifengyun/article/details/72934531。已經做出較為詳細的說明,這裡對於其中一些更細節的內容做出一些記錄,僅供學習參考。 文中提到了optee_probe是建立optee驅動的最後一步,其中

C語言中宣告定義初始的區別

函式和變數(全域性變數)都有宣告和定義, 對於函式而言: 同一檔案內,如果函式fun_1呼叫fun_2時,如果fun_2在fun_1之後定義,則需在fun_1之前對fun_2進行宣告,如下: void fun_2();// 宣告 void fun_1() { ... fu

Java中靜態成員的初始

//: initialization/StaticInitialization.java// Specifying initial values in a class definition./* *   2018年3月20日10:09:27 *   程式碼位置: java