JVM_07 Class文件结构
生活随笔
收集整理的這篇文章主要介紹了
JVM_07 Class文件结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概述(了解)
①. Java語言:跨平臺的語言
- 當Java源代碼成功編譯為字節碼后,如果想在不同的平臺上運行,則無須再次編譯
- 這個優勢不再那么吸引人了。Python PHP perl ruby lisp等有強大的解釋器
- 跨平臺似乎已經快成為一門語言必須的特征
②.Java虛擬機:跨語言的平臺:
(Java虛擬機不和包括java在內的任何語言綁定,它只與class文件這種二進制文件格式所關聯。無論使用何種語言進行軟件開發,只要將源文件編譯為正確的Class文件,那么這種語言就可以在Java虛擬機上執行,可以說,統一而強大的Class文件結構,就是Java虛擬機的基石、橋梁)
③. 想要讓一個Java程序正確地運行在JVM中,Java源碼就必須要編譯為符合JVM規范的字節碼
- 前端編譯器的主要任務就是負責將符合Java語言規范的Java代碼轉換為符合JVM規范的字節碼文件
- javac是一種能夠將Java源碼編譯為字節碼的前端編譯器
- javac編譯器在將Java源碼編譯為一個有效的字節碼文件過程中經歷了4個步驟:分別是詞法解析、語法解析、語義解析以及生成字節碼
二、Java的前端編譯器(了解)
①. 前端編譯器 vs 后端編譯器
②. 圖解:
三、透過字節碼指令看代碼細節
①. Integer:透過字節碼可以看出,當Integer的范圍在-128 - +127 之間會在數組中直接拿取數值,超過這個范圍會重新new對象
public class IntegerTest {public static void main(String[] args) {/** 透過字節碼可以看出,當Integer的范圍在-128 - +127 之間會在數組中直接拿取數值* 超過這個范圍會重新new對象* */Integer x = 5;int y = 5;System.out.println(x == y);Integer i1 = 10;Integer i2 = 10;System.out.println(i1 == i2);//trueInteger i3 = 128;Integer i4 = 128;System.out.println(i3 == i4);//false}②. 在父類中調用方法,如果子類有重寫,那么調用的是子類的方法,如代碼中的this.print( )
/* 成員變量(非靜態的)的賦值過程:① 默認初始化 -② 顯式初始化 /代碼塊中初始化 -③ 構造器中初始化 -④ 有了對象之后,可以“對象.屬性”或"對象.方法"的方式對成員變量進行賦值。*/ class Father {int x = 10;public Father() {this.print();x = 20;}public void print() {System.out.println("Father.x = " + x);} } class Son extends Father {int x = 30; // float x = 30.1F;public Son() {this.print();x = 40;}public void print() {System.out.println("Son.x = " + x);} }public class SonTest {public static void main(String[] args) {Father f = new Son();System.out.println(f.x);} }③. 靜態變量隨著類的加載就加載了,在鏈接(準備階段)會為靜態變量賦予默認的初始化值,在初始化階段會顯示的賦值
/* 輸出結果:父類的靜態成員屬性父類靜態代碼塊子類的靜態成員屬性子類靜態代碼塊父類構造方法子類構造方法 */ public class People {private final static String parentStaitc = "父類的靜態成員屬性";public static void main(String[] args) {People people = new Child();}public People() {System.out.println("父類構造方法");}static{System.out.println(parentStaitc);System.out.println("父類靜態代碼塊");} }class Child extends People {private final static String childStaitc = "子類的靜態成員屬性";public Child() {System.out.println("子類構造方法");}static{System.out.println(childStaitc);System.out.println("子類靜態代碼塊");} }四、class文件結構組織示意圖
總結
以上是生活随笔為你收集整理的JVM_07 Class文件结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM_06 垃圾收集器[ 三 ]
- 下一篇: 超30万字的中台实战100讲2.0最终版