深入淺出地介紹Java重要特性

上一期中我們聊到的面向對象的演進過程的3個發展階段在Java中得到很好的體現,本期我就帶著大家領略下Java世界的多姿多彩!

Write Once,run anywhere

為了讓Java能夠實現跨平臺,Java的發明者們增加了一個抽象層,即JVM(Java Virtual Machine,Java虛擬機),自定義一套指令並且和硬件無關,為每個操作系統實現一套JVM,通過JVM實現了Java的跨平臺。需要注意的是目前有很多語言都是在JVM上實現的,例如Scala、Groovy、Clojure、JRuby、Jython等,這些語言通過映射到JVM的指令集上就實現了在JVM上運行。

深入淺出地介紹Java重要特性

JRE和JDK之間的關係?

JRE(Java Runtime Environment),可以認為就是JVM;JDK(Java Development Kit)是Java開發工具包,它包含javac、jar、JRE,所以JDK是包含jre。

深入淺出地介紹Java重要特性

Java SE,Java EE ,Java ME之間是什麼關係?

Java SE(Standard Edition,標準版),它提供了Java API;Java EE(Enterprise Edition,企業版),它包含Web相關技術(Jsp、servlet、jdbc、ebj、jtc);Java ME(Mobile Edition,移動版),考慮到SE需要很多計算機的資源,因此ME使用了SE部分功能,它在Iphone和安卓出來之前,Java ME是很火的,目前基本沒人在用了。

深入淺出地介紹Java重要特性

註解(Annotation)

註解可以改變類型的定義,例如現在比較有名的lombok,它在編譯源代碼是修改AST(抽象語法樹)來實現目標,比如說給POJO自動實現get方法、set方法和toString方法等。具體代碼如下:

public @Data class Demo{ private String name;}@Target(ElementType.TYPE)@Retention(RetentionPolicy.SOURCE)public @interface Data{ String staticConstructor() default " ";}

源代碼編譯之後:

public class Demo{ private String name; public Demo(){ } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int hashCode(){ ... } public String toString(){ ... }}

泛型(Generics)

為了將代碼儘可能的複用,除了使用多態性以外,我們還經常使用泛型。多態是在運行時處理的,而泛型是在編譯時就獲取到具體的類型,同時,一旦編譯完成,所有和泛型有關的類型全部擦除,這樣做的好處是使用類型推導避免強制類型轉換,和編譯期的類型安全檢查。

public void test(){ List list = Arrays.asList(1,2,3); list.add(4); int i = list.get(0);}

類型檫除之後,JVM完成類型轉換。

public void test(){ List list = Arrays.asList(1,2,3); list.add(4); int i = (Integer)list.get(0);}

反射(Reflection)

上面介紹的註解和泛型都是發生在編譯期,而接下來要介紹的反射發生在運行時的。我們知道每個java文件都會被編譯成一個.class文件,這些class文件會被JVM裝入到虛擬機中,接著,JVM會把類的信息(包括父類、接口、構造函數、方法、屬性等)存放到方法區中,所以,在運行時我們可以查看到類的所有信息。常見的方法有:

// 獲取所有級別的字段Field[] fields = clz.getDeclaredFields();// 獲取public字段for(int i =0;i

本期就帶領大家熟悉一下Java語言幾個重要特性,後面幾期會詳細介紹這些特性。


分享到:


相關文章: