1. 程式人生 > >深入java static關鍵字 在繼承場景中jvm類載入器對其進行的優化

深入java static關鍵字 在繼承場景中jvm類載入器對其進行的優化

上一篇文章我們說到了static關鍵字,可是本人覺得還不是很完整,現在補一篇文章舉例說明static關鍵字對jvm類載入器的影響,這篇文章講解了jvm對關鍵字static進行的優化。原創不易,轉載請註明出處。

1.當子類主動訪問的時候,會引起其父類的初始化

舉一個例子:

/**
 * @author yangwuyi
 */
class Father{
    static int age ;
    static {
        System.out.println("Father's static CodeBlock");
        age = 100;
    }
}
class
Son extends Father{
static int high ; static { System.out.println("Son's static CodeBlock"); high = 176; } } public class StaticEffic { @Test public void test(){ System.out.println(Son.high); } }

執行的結果是:
這裡寫圖片描述
因為直接訪問Son.high,會先初始化Father類,然後初始化Son類。

2.子類直接訪問父類的變數,只會初始化父類而不會初始化子類

舉個例子
但是如果通過子類直接訪問父類的變數,jvm只會初始化父類而不會初始化子類

import org.junit.Test;
/**
 * @author yangwuyi
 */
class Father{
    static int age ;
    static {
        System.out.println("Father's static CodeBlock");
        age = 100;
    }
}
class Son extends Father{
    static int high ;
   // static int age; 
    static {
        System.out.println("Son's static CodeBlock"
); high = 176; age = 55; } } public class StaticEffic { @Test public void test(){ System.out.println(Son.age); System.out.println(Son.high); System.out.println(Father.age); } }

我們會發現這一次執行的效果是:
這裡寫圖片描述
這裡就很明顯了,因為當我們呼叫Son.age的時候,static age在記憶體中只有一份,所以jvm會認為當我們執行Son.age的時候,必須要初始化Father類,這樣才可以訪問到age變數,這個時候Father類完成初始化Static程式碼塊執行完畢。但是因為Son和Father的Static int age在記憶體中只有一份,既然只有一份那就不初始化Son了,但是當我們呼叫Son.high的時候,jvm這個時候才會初始化Son類,輸出“Son’s static CodeBlock”;然後對age變數賦值,因為Father和Son的Static int age在記憶體中只有一份,所以當我們輸出Father.age的時候,一樣是55。這就是JVM對Static的優化。

相關推薦

深入java static關鍵字繼承場景jvm載入進行優化

上一篇文章我們說到了static關鍵字,可是本人覺得還不是很完整,現在補一篇文章舉例說明static關鍵字對jvm類載入器的影響,這篇文章講解了jvm對關鍵字static進行的優化。原創不易,轉載請註明

深入java static關鍵字 淺析java載入機制(解答java靜態方法或變數無法訪問非靜態資料)

想要清晰理解java語法,不瞭解java和jvm的機制是不行的,以前不理解java中用static修飾方法和變數為什麼不可以訪問非靜態方法和資料,現在明瞭,如果你也有相同的困惑,這篇部落格足以解惑,原創不易,轉載請宣告出處。 本文分為3大部分 static

Java虛擬機器原理圖解》5. JVM載入機制與載入過程

0、前言 讀完本文,你將瞭解到: 一、為什麼說Jabalpur語言是跨平臺的 二、Java虛擬機器啟動、載入類過程分析 三、類載入器有哪些?其組織結構是怎樣的? 四、雙親載入模型的邏輯和底層程式碼實現是怎樣的? 五、類載入器與Class<T>  例項的關係

十、JAVA多執行緒:JVM載入(自動載入、雙親委託機制、載入名稱空間、執行時包、的解除安裝等)

  Jvm提供了三大內建的類載入器,不同的類載入器負責將不同的類載入到記憶體之中 根載入器(Bootstrap ClassLoader) 是最頂層的載入器,是由C++編寫的,主要負責虛擬機器核心類庫的載入,如整個java.lang包,根載入器是獲取不到引用的,因此

深入Java虛擬機器】之九:載入及執行子系統的案例與實戰

摘自《深入理解 Java 虛擬機器:JVM 高階特性與最佳實踐》(第二版) 概述         在 Class 檔案格式與執行引擎這部分中,使用者的程式能直接影響的內容並不太多,Class 檔案以何種格式儲存,型

深入Java虛擬機器】之三:載入機制

類載入過程     類從被載入到虛擬機器記憶體中開始,到卸載出記憶體為止,它的整個生命週期包括:載入、驗證、準備、解析、初始化、使用和解除安裝七個階段。它們開始的順序如下圖所示:     其中類載入的過程包括了載入、驗證、準備、

深入Java虛擬機器】之四:載入機制

    我們來看得到該結果的步驟。首先在準備階段為類變數分配記憶體並設定類變數初始值,這樣A和B均被賦值為預設值0,而後再在呼叫<clinit>()方法時給他們賦予程式中指定的值。當我們呼叫Child.b時,觸發Child的<clinit>()方法,根據規則2,在此之前,要先執行完其父

詳細講解Java載入

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

java載入

先了解一下類中的載入器載入的時候從底向上查詢,在從上往下嘗試載入。類載入器的載入機制,首先類載入器接收到類後不會直接載入,而會先把它委託給自己的父類載入器完成,每一個載入器都是這樣,所以現象就是從底向上的查詢,所以最終都會傳送到頂層的啟動類載入器,除非父類無法載入時,反饋給子

深入JVM載入

01、類載入器原理 02、類載入器樹狀結構、雙親委託(代理)機制 03、自定義類載入器(檔案、網路、加密) 04、執行緒上下文類載入器 05、伺服器類載入原理 1、類載入器的作用 將class檔案位元組碼內容載入到記憶體中,並將這些靜態資料轉換成方

finalkeywordJVM載入的影響

public fin port args stat gpo sys tint () 眾所周知,當訪問一個類的變量或方法的時候。假設沒有初始化該類。就會先去初始化一個類 可是,當這個類的變量為final的時候,就

JVM載入與雙親委派模型(二)

(7)URLClassLoader類 前面說到,ClassLoader這個頂級父類只是定義好了雙親委派模型的工作機制;但是ClassLoader是個抽象類,無法直接建立物件,所以需要由繼承它的子類完成建立物件的任務。子類需要自己實現findClass方法,並且在例項化時指定parent屬性的值

JVM載入與雙親委派模型(一)

(1)動態載入       類載入器是 Java 語言的一個創新,也是 Java 語言流行的重要原因之一。它使得 Java 類可以被動態載入到 Java 虛擬機器中並執行。類載入器從 JDK 1.0 就出現了,最初是為了滿足 Java Applet 的需要

JVM載入

(1)下面第一種和第二種會初始化A執行它的static裡面的程式碼塊,但是第三種不會,主要原因就在於第三種情況訪問的A的靜態變數是靜態常量,所以雖然是主動呼叫了A,但是不會去初始化A,這算是靜態常量的特殊性。JVM01是入口類,所以它的靜態程式碼塊是肯定要執行的

JVM 載入_2

名稱空間深度解析 直接先上例子 package com.ssy.jvm.classloader; import java.lang.reflect.Method; public class MyTe

JVM 載入_3

啟動類載入器深入      內建於JVM中的啟動類載入器會載入java.lang.ClassLoader以及其他的Java平臺類。 當JVM啟動時,一塊特殊的機器碼會執行,它會載入擴充套件類載入器與系統類載入器,這塊特殊的機器碼叫做啟動類載入器(Bootstra

jvm:載入與雙親委派模型

兩個類相等需要類本身相等,並且使用同一個類載入器進行載入。這是因為每一個類載入器都擁有一個獨立的類名稱空間。 這裡的相等,包括類的 Class 物件的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回結果為 true,也包括使用 ins

Java面試題:面向物件,載入,JDBC, Spring 基礎概念

    1. 為什麼說Java是一門平臺無關語言? 平臺無關實際的含義是“一次編寫到處執行”。Java 能夠做到是因為它的位元組碼(byte code)可以執行在任何作業系統上,與底層系統無關。 2. 為什麼 Java 不是100%面向物件? Java

JVM載入機制與載入過程

0、前言 讀完本文,你將瞭解到: 一、為什麼說Jabalpur語言是跨平臺的 二、Java虛擬機器啟動、載入類過程分析 三、類載入器有哪些?其組織結構是怎樣的? 四、雙親載入模型的邏輯和底層程式碼實現是怎樣的? 五、類載入器與Class<T> 

黑馬程式設計師--java高新技術 26--javaBean,泛型,載入,代理spring小框架

---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ---------------------- /*設計模式: Singleton: 單例模式 Factorty: 工廠模式 Iterator: 迭代器模