挤公交忘穿内裤被挺进,國產日韓亞洲精品AV,午夜漫画,china中国gary廖男男

怎樣學好java

一、怎樣學好java

目前 Java 可以說是產業界和學術界最熱門的語言,許多讀者都很急切想把 Java 學好。除非像電影「駭課任務」(Matrix)一樣能夠把需要的專業技巧下載到腦海(女主角只花了幾秒下載資料,就馬上具備飛行員的技巧),或是武俠小說中的運功傳送內力的方式,否則花上一段時間苦學是免不了的。花時間,不打緊,就怕方法錯誤,事倍功半。我認為,學習 Java 包括了下列的范疇: * 認識 Java 的原理 * 學會 Java 語言 * 物件導向的思維 * API * 開發工具的用法 下面分別就這幾點詳細闡述。 學習 Java 的原理 了解 Java 的原理,才有可能真正體會 Java 的一切,學習任何事情,只要能掌握原理,就會比較順利。我發現許多人使用 Java 已經逾年,卻連 Java 最基本的特質都不清楚。 一般來說,資訊系畢業的學生,對於資訊的新事物學習的速度,會比其他科系來得快,就是因為四年的教育為他們奠定了學習新事物的基礎,這也是資訊系課程的價值所在。 除非你受過的基礎訓練夠扎實,否則在學習或使用 Java 的過程中,你一定會需要參考到這些資訊系學科的知識。我建議各位可以在閑暇之余,把資訊系課本的書拿來讀一讀。這是治本之道,絕非立竿見影的特效藥,必須要有耐心。 學習 Java 語言 學習 Java 語言很簡單,畢竟 Java 語言也只包含五十多個關鍵字(keyword)與幾十個算符(operator),再加上 Java 語法(syntax)也很簡單,所以一般人可以很快就學會 Java 語言。危險的是,很多人認為已經完全掌控 Java 語言,但其實對於內部的運作機制仍不能掌握,這些盲點有時候會讓你無法完全掌控 Java 語言。克服這些盲點的方式是看「The Java Language Specification, 2nd Ed.」(沒有中文版)來徹底弄懂 Java 程式語言,并看「Inside the Java Virtual Machine, 2nd Ed.」(有中文版,但翻譯得@#%$)來徹底掌握 Java 虛擬機器的運作方式。 學習物件導向的思維 學會了語言,并不代表就可以設計出好的物件導向系統架構。想要成為物件導向的專家,往往需要: * 多看相關的書,特別是 Design Pattern 和 Refactoring 的書。 * 多觀摩別人的程式(例如 Java API 的 design 與 implementation) * 多寫程式 學習 API 學會 Java 語言之后,還需要學會一些 API 才能寫出有用的程式。Java 的 API 非常多,必須規劃好一個學習路徑,才不會在浩瀚的 API 大海中迷失。必備的 API 包括了:IO、New IO、Collection Framework、Network、RMI、JAXP... 等。至於其他的 API,就看你的需求而定,大致上分成: * GUI 類:JavaBean -> Swing -> JavaHelp -> Java2D -> Image IO -> JAI -> Java 3D ... * Enterprise 類:JDBC -> JDO -> Servlet -> JSP -> EJB -> JMS -> JTA/JTS... * J2ME 類(這一類不是我的專長,無法提供學習順序建議) 學習開發工具的用法 只用 JDK,是很難寫出大型程式的,所以通常程式員會使用 JBuilder/VisualAge/ VisualCafe 等工具,這些軟體賣這麼貴,一定有它的價值,值得花一些時間好好學習這些開發工具的使用方式,你將會發現開發工具所提供的許多功能,可以讓你在開發過程中生產力大增。希望可以幫助你,滿意的話,希望采納,謝謝

二、怎么最快學好java

首先要把心態放平,任何事都是欲速則不達的。但是要努力,任何事都是可以鐵杵磨成針的。

三、Java JVM怎么學習啊?從哪方面入手

一、 JVM的生命周期

1. JVM實例對應了一個獨立運行的java程序它是進程級別

a) 啟動。啟動一個Java程序時,一個JVM實例就產生了,任何一個擁有public static void main(String[] args)函數的class都可以作為JVM實例運行的起點

b) 運行。main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創建的線程是守護線程

c) 消亡。當程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出

2. JVM執行引擎實例則對應了屬于用戶運行程序的線程它是線程級別的

二、 JVM的體系結構

1. 類裝載器(ClassLoader)(用來裝載.class文件)

2. 執行引擎(執行字節碼,或者執行本地方法)

3. 運行時數據區(方法區、堆、java棧、PC寄存器、本地方法棧)

三、 JVM類加載器

JVM整個類加載過程的步驟:

1. 裝載

裝載過程負責找到二進制字節碼并加載至JVM中,JVM通過類名、類所在的包名通過ClassLoader來完成類的加載,同樣,也采用以上三個元素來標識一個被加載了的類:類名+

包名+ClassLoader實例ID。

2. 鏈接

鏈接過程負責對二進制字節碼的格式進行校驗、初始化裝載類中的靜態變量以及解析類中調用的接口、類。

完成校驗后,JVM初始化類中的靜態變量,并將其值賦為默認值。

最后對類中的所有屬性、方法進行驗證,以確保其需要調用的屬性、方法存在,以及具備應的權限(例如public、private域權限等),會造成NoSuchMethodError、NoSuchFieldError等錯誤信息。

3. 初始化

初始化過程即為執行類中的靜態初始化代碼、構造器代碼以及靜態屬性的初始化,在四種情況下初始化過程會被觸發執行:

調用了new;

反射調用了類中的方法;

子類調用了初始化;

JVM啟動過程中指定的初始化類。

JVM類加載順序:

JVM兩種類裝載器包括:啟動類裝載器和用戶自定義類裝載器。

啟動類裝載器是JVM實現的一部分;

用戶自定義類裝載器則是Java程序的一部分,必須是ClassLoader類的子類。

JVM裝載順序:

Jvm啟動時,由Bootstrap向User-Defined方向加載類;

應用進行ClassLoader時,由User-Defined向Bootstrap方向查找并加載類;

1. Bootstrap ClassLoader

這是JVM的根ClassLoader,它是用C++實現的,JVM啟動時初始化此ClassLoader,并由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的實現)中所有class文件的加載,這個jar中包含了java規范定義的所有接口以及實現。

2. Extension ClassLoader

JVM用此classloader來加載擴展功能的一些jar包。

3. System ClassLoader

JVM用此classloader來加載啟動參數中指定的Classpath中的jar包以及目錄,在Sun JDK中ClassLoader對應的類名為AppClassLoader。

4. User-Defined ClassLoader

User-DefinedClassLoader是Java開發人員繼承ClassLoader抽象類自行實現的ClassLoader,基于自定義的ClassLoader可用于加載非Classpath中的jar以及目錄。

ClassLoader抽象類的幾個關鍵方法:

(1) loadClass

此方法負責加載指定名字的類,ClassLoader的實現方法為先從已經加載的類中尋找,如沒有則繼續從parent ClassLoader中尋找,如仍然沒找到,則從System ClassLoader中尋找,最后再調用findClass方法來尋找,如要改變類的加載順序,則可覆蓋此方法

(2) findLoadedClass

此方法負責從當前ClassLoader實例對象的緩存中尋找已加載的類,調用的為native的方法。

(3) findClass

此方法直接拋出ClassNotFoundException,因此需要通過覆蓋loadClass或此方法來以自定義的方式加載相應的類。

(4) findSystemClass

此方法負責從System ClassLoader中尋找類,如未找到,則繼續從Bootstrap ClassLoader中尋找,如仍然為找到,則返回null。

(5) defineClass

此方法負責將二進制的字節碼轉換為Class對象

(6) resolveClass

此方法負責完成Class對象的鏈接,如已鏈接過,則會直接返回。

四、 JVM執行引擎

在執行方法時JVM提供了四種指令來執行:

(1)invokestatic:調用類的static方法

(2)invokevirtual:調用對象實例的方法

(3)invokeinterface:將屬性定義為接口來進行調用

(4)invokespecial:JVM對于初始化對象(Java構造器的方法為:<init>)以及調用對象實例中的私有方法時。

主要的執行技術有:

解釋,即時編譯,自適應優化、芯片級直接執行

(1)解釋屬于第一代JVM,

(2)即時編譯JIT屬于第二代JVM,

(3)自適應優化(目前Sun的HotspotJVM采用這種技術)則吸取第一代JVM和第二代

JVM的經驗,采用兩者結合的方式

開始對所有的代碼都采取解釋執行的方式,并監視代碼執行情況,然后對那些經常調用的方法啟動一個后臺線程,將其編譯為本地代碼,并進行優化。若方法不再頻繁使用,則取消編譯過的代碼,仍對其進行解釋執行。

五、 JVM運行時數據區

第一塊:PC寄存器

PC寄存器是用于存儲每個線程下一步將執行的JVM指令,如該方法為native的,則PC寄存器中不存儲任何信息。

第二塊:JVM棧

JVM棧是線程私有的,每個線程創建的同時都會創建JVM棧,JVM棧中存放的為當前線程中局部基本類型的變量(java中定義的八種基本類型:boolean、char、byte、short、int、long、float、double)、部分的返回結果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址

第三塊:堆(Heap)

它是JVM用來存儲對象實例以及數組值的區域,可以認為Java中所有通過new創建的對象的內存都在此分配,Heap中的對象的內存需要等待GC進行回收。

(1) 堆是JVM中所有線程共享的,因此在其上進行對象內存的分配均需要進行加鎖,這也導致了new對象的開銷是比較大的

(2) Sun Hotspot JVM為了提升對象內存分配的效率,對于所創建的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配對象時不需要加鎖,因此JVM在給線程的對象分配內存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內存的性能和C基本是一樣高效的,但如果對象過大的話則仍然是直接使用堆空間分配

(3) TLAB僅作用于新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。

第四塊:方法區域(Method Area)

(1)在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代。

(2)方法區域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當開發人員在程序中通過Class

對象中的getName、isInterface等方法來獲取信息時,這些數據都來源于方法區域,同時方法區域也是全局共享的,在一定的條件下它也會被GC,當方法區域需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。

第五塊:運行時常量池(Runtime Constant Pool)

存放的為類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區域中分配。

第六塊:本地方法堆棧(Native Method Stacks)

JVM采用本地方法堆棧來支持native方法的執行,此區域用于存儲每個native方法調用的狀態。

六、 JVM垃圾回收

GC的基本原理:將內存中不再被使用的對象進行回收,GC中用于回收的方法稱為收集器,由于GC需要消耗一些資源和時間,Java在對對象的生命周期特征進行分析后,按照新生代、舊生代的方式來對對象進行收集,以盡可能的縮短GC對應用造成的暫停

(1)對新生代的對象的收集稱為minor GC;

(2)對舊生代的對象的收集稱為Full GC;

(3)程序中主動調用System.gc()強制執行的GC為Full GC。

不同的對象引用類型, GC會采用不同的方法進行回收,JVM對象的引用分為了四種類型:

(1)強引用:默認情況下,對象采用的均為強引用(這個對象的實例沒有其他對象引用,GC時才會被回收)

(2)軟引用:軟引用是Java中提供的一種比較適合于緩存場景的應用(只有在內存不夠用的情況下才會被GC)

(3)弱引用:在GC時一定會被GC回收

(4)虛引用:由于虛引用只是用來得知對象是否被GC

主站蜘蛛池模板: 区。| 海晏县| 鹤壁市| 图木舒克市| 海安县| 敖汉旗| 右玉县| 红桥区| 华蓥市| 宁德市| 茌平县| 千阳县| 余庆县| 漯河市| 庐江县| 吉水县| 上杭县| 浏阳市| 阿拉善右旗| 漯河市| 华亭县| 永济市| 遵义市| 甘洛县| 长海县| 来安县| 稻城县| 冕宁县| 桑日县| 鹤岗市| 莆田市| 东阳市| 沂源县| 祁门县| 梧州市| 广水市| 平乐县| 宜州市| 获嘉县| 田东县| 灵璧县|