2018/7/26:
看極客時間中《java核心技術36講》第一章問題
1.什么是解釋執(zhí)行什么是編譯執(zhí)行?
解釋執(zhí)行:類似口譯,要執(zhí)行一句就解釋一句為機器語言,適合小型的項目。
編譯執(zhí)行:類似全文翻譯,先編譯為機器語言,然后你再執(zhí)行,適合大型項目。
?2.java是解釋執(zhí)行嗎?
在我淺薄的認知中,我不知道為什么會有這樣的問題。開始學的時候,老師就說java是編譯執(zhí)行,python是解釋執(zhí)行,真是一臉懵逼。我猜測老師說的是下面說的前半部分,問題問的是后半部分?
作者說:
首先:Java分為①編譯期和② 運行期。
1).java-- 編譯---->.class? ?-------->這個步驟是一次編譯,到處執(zhí)行那句話。
2).class----->類加載器------->解釋/編譯執(zhí)行
在運行期:
a)jvm內嵌的解釋器講.class轉換成最終的機器碼。?
b)大多數的JVM,都提供JIT(Just-In-Time)動態(tài)編譯器,將熱點代碼編譯成機器碼,這種情況就是編譯執(zhí)行而不是解釋執(zhí)行。
c)還有一種新的AOT(Ahead-of-Time-Compilation)直接講字節(jié)碼編譯成機器碼,避免JIT預熱各方面的開銷。比如Oracle JDK 9
所以:.java是解釋執(zhí)行嗎?錯,java有解釋執(zhí)行,混合執(zhí)行,編譯執(zhí)行
評論中有這么一:
首先javac編譯器將源代碼編譯成字節(jié)碼。
然后jvm類加載器加載字節(jié)碼文件,然后通過解釋器逐行解釋執(zhí)行,這種方式的執(zhí)行速度相對會比較慢。有些方法和代碼塊是高頻率調用的,也就是所謂的熱點代碼,所以引進jit技術,提前將這類字節(jié)碼直接編譯成本地機器碼。這樣類似于緩存技術,運行時再遇到這類代碼直接可以執(zhí)行,而不是先解釋后執(zhí)行。
2018/8/15:
?1.為什么匿名類引用外面的變量必須要用final:


第一次知道這個事情是在寫安卓代碼的時候,當時就相當想知道著是為什么呢?但是當時淺薄的認知,連要百度的問題我都不知道GG。今天突然看到有人說為什么,我激動哦。
他說java傳參,是傳值而不是傳引用,這就是最本質的原因。
2.值傳遞和引用傳值:什么意思?
jvm中有堆和棧,棧中存放對象的引用,局部變量,操作數等。棧中存放對象的實例。值傳遞就是傳遞棧中的值,不是堆中的。
小總結:
形參就是:方法聲明時候的()里面的值? ? ? ? 實參就是:方法調用的時候傳入的值。
基本數據類型 ?:將實參的值傳遞給形參
?引用數據類型:將實參的對應的堆空間的首地址值傳遞給形參
?網上有人說:為了生命周期和可見性的問題:使用了final ??
具體推薦final語義:? 大神寫的
- final保證傳入值是不可變得:?(指令重排導致傳入參數的值是不確定的。)這句話我猜的。
- final 屬性的值因為compilers 緩存在寄存器中,而不用像普通屬性一樣從內存中重新讀取。
我說錯完了,希望有人指正。
3.類的方法的參數,任何方法都會有一個默認的參數在第一個參數 this
