Java是個狠人,但我有化骨綿掌

Java是個狠人,但我有化骨綿掌

There are only two kinds of languages: the ones people complain about and the ones nobody uses.

C++ 之父 Bjarne Stroustrup 說:“世界上只有兩種語言,一種飽受詬病,另一種沒人使用。” 作為一門十多年來經久不衰的語言,Java 難免會飽受詬病。

Java是個狠人,但我有化骨綿掌

但是,正如 Java 之父 James Gosling 在 The Feel of Java 中所說的那樣:

“Java 是一門藍領語言。它不是博士學位論文的材料,而是用於工作的語言。”

現實情況也是這樣,Java 已經被大量的公司大規模使用:Google、Amazon、Netflix、Alibaba、Baidu、Tencent、ByteDance等。

歷史

1991 年,如日中天的 Sun 公司開發了一種用於開發家電產品中的軟件的編程語言。之後,經過不斷改良,於 1996 年 1 月發佈了 JDK 1.0。一開始,這種新式編程語言的名字叫作 Oak,不過由於這個名稱已被其他公司註冊成了商標,所以又更名為了 Java。此後,Java 開始快速發展,2020 年 3 月 17 日,Java 14 正式發佈。

Java是個狠人,但我有化骨綿掌

據說,之所以取名叫 Java,是因為當時 James Gosling 的團隊中有一名成員特別喜歡喝 Java Insland(印尼爪哇島)上的一種咖啡。因為這個原因,後面主要由 JetBrains 的俄羅斯開發團隊開發出來的 Kotlin 語言,也選擇了以位於俄羅斯的 Kotlin Island 來給自己的語言命名。

Java 能夠叱吒十餘年屹立不倒,它有什麼優點呢?

生態

Java 擁有良好的生態,擁有大量第三方庫以及企業級框架。例如,在 Web 服務器方面,有 Apache Tomcat 、Eclipse Jetty 這樣的被廣泛使用的成熟項目;在大數據領域,Apache Hadoop、Apache Spark、Apache Kafka 等優秀項目都是使用 Java 開發的;在 Web 應用中,Spring MVC、Spring Boot、Spring Cloud 這樣框架已經被大量企業大規模使用。

語言的生態顯然是極其重要的,在軟件工程領域,複用是一個重要的思想,絕大多數軟件開發者都必須站在巨人的肩膀上,藉助前人寫好的“輪子”,來快速可靠地組裝自己想要實現的那輛“汽車”

虛擬機

Java 的發佈使得虛擬機的概念開始為普通開發者所知。得益於 Java 虛擬機,使用 Java 編寫的程序能夠實現一次編寫,到處運行(Write Once, Run anywhere)的目標,這使得 Java 能夠被廣泛應用於各個行業。

今天的 Java,可以說早已是一門無處不在的語言了——從物聯網(IOT)到移動通訊設備、再到個人計算機,再到雲平臺。作為一個高度成熟等抽象計算機體系結構模型,JVM 定義了相應的虛擬指令集、執行模型、內存模型、線程模型以及安全模型。

因此,我們可以看到,在 JVM 之上,運行著 Kotlin、Scala、Grrovy、Jython、JRuby 等眾多語言。

Java是個狠人,但我有化骨綿掌

垃圾回收

Java 是一門使用垃圾回收進行內存管理的面向對象編程語言。為什麼說 Java 是一門安全語言?因為 JVM 並不向程序員提供能夠直接操作內存的接口。

申請容易,釋放難,手動進行內存管理是一項極其危險的工作。對於那些使用完畢的內存空間,必須逐一進行釋放,稍有不慎就會發生內存洩漏,即內存空間在使用完畢後沒有歸還給操作系統。對一個需要長期穩定運行的系統來說,內存洩漏就像千里之堤潰於蟻穴那樣,最終可能會導致內存最終被佔滿,系統無法繼續正常申請內存空間,甚至可能會崩潰。

同時,如果一塊內存空間,還未使用完畢,就被錯誤釋放了,顯然會使得程序面臨段錯誤(Segmentation Fault)。總之,在一個需要手動管理內存的程序中,很容易因為內存的管理問題產生許多難以定位的 Bug。在 Java 中,內存管理的任務由 JVM 的垃圾回收算法(Garbage Collection)完成,程序員能夠把時間花在更核心的編程工作之上,在需要對象時直接創建即可,而無需被對象分配在哪、何時釋放對象等問題所困擾。

Java 一直在發展

Java 是一門有著 20 多年曆史的編程語言,或許有人會對 Java 嗤之以鼻,認為 Java 太過陳舊、太過笨重、已經不值得深入學習了。實際上,並不是這樣的,無論你學或不學,Java 一直都站在那;無論你關心或不關心,Java 也一直在發展。

從 Java 誕生之初到今天,世界上已經有太多的語言變得不再流行了,例如:Pascal、Delphi、COBOL、Ada。但是,Java 不僅活了下來,而且成功地搶佔了編程生態系統中的大片位置。

有句俗語叫做:“富不過三代。”Java 能取得今天的成就,固然與先天的優勢有關,但更與後天的努力密不可分。例如,Java 5 引入的註解極大地簡化了開發工作,使得依賴注入成為了可能;Java 7 中添加了 Fork/Join 框架,使得加速處理大型任務更加容易;Java 8 引入的 lambda 表達式和 Stream API 使得程序員們能夠書寫更簡潔的代碼、更容易地實現並行;Java 14 更引入了 Records 特性,讓開發人員不用再編寫大量的 POJO (Plain Ordinary Java Object),也不必再借助 Lombok 或者 IDE 自動生成這些機械化的代碼。

同時,Java 帶給人的那種“一字一板”的感覺,在軟件工程領域也是非常重要的。

對於大多數開發者來說,閱讀代碼的時間會比寫代碼的時間多得多。我們不是在讀自己寫的代碼的路上,就是在讀別人寫的代碼的路上。Java 這種“一字一板”的語言,所帶來的可讀性,能夠幫助我們更快地理解代碼的意圖,更快地去修改代碼。畢竟,有時候太過簡潔,寫的時候可能很舒服,但會給後續的維護埋下太多的坑;而太過囉嗦,語法密度太高,又會使人摸不著頭腦。所以,Java 是一門比較適合企業級大規模使用的語言。

那麼,我們該如何學習Java呢?

跟著薛小小一起學 Java 吧

薛小小何許人也?他是一名來自德國的熱心青年。

他將會以圖文並茂的對話式的學習方式,帶你由淺入深地瞭解那些你需要知道的 Java 7、Java 8 和 Java 9 的內容:從基礎的變量、基本數據類型、流程控制、類,到比較高級的泛型、lambda、併發、GUI 編程等內容,薛小小都會不遺餘力地為你娓娓道來。

Java是個狠人,但我有化骨綿掌

這就是這本有趣的書的封面,中間那個boy就是主人公薛小小了

Java是個狠人,但我有化骨綿掌

薛小小是個腦袋裡有很多問號的Java初學者,就像初學Java的你我他

Java是個狠人,但我有化骨綿掌

作者是德國的菲利普·阿克曼(Philip Ackermann)

Java是個狠人,但我有化骨綿掌

由淺入深,對初學者非常友好,“你好啊,小薛!”

Java是個狠人,但我有化骨綿掌

循序漸進,快樂學習

Java是個狠人,但我有化骨綿掌

在“化骨綿掌式”的回答後,Java學習輕而易舉,你又可以快樂了~

流暢接口

薛小小告訴我們,有一種被稱為流暢接口(fluent interface)的代碼書寫方式,能很好地提高代碼閱讀性並減少代碼編寫量,它通過 . 把各個方法連接起來形成方法鏈。

在 Java 代碼中,我們經常會看到大量的 getter、setter 方法。

<code>public class Puppy {
private int age;
private String name;
private String color;
public Puppy() { }
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
}/<code>

由於 setter 方法一般我們會定義為 void,所以我們會寫出大量類似這樣的代碼:

<code>Puppy puppy = new Puppy();
puppy.setAge(1);
puppy.setName("little");
puppy.setColor("white");/<code>

如果一個類的成員很多,那麼,創建一個類實例並給這個實例賦值的過程將導致我們寫出類似上面這樣的大量機械化的代碼。

薛小小告訴了我們一個小技巧,在這種平凡的 setter 方法中,如果我們在每個 setter 方法的末尾動態地返回對象變量值的話,我們能夠寫出更漂亮的代碼

<code>public class Puppy {
private int age;
private String name;
private String color;
public Puppy() { }
public Puppy setAge(int age) {
this.age = age;
return this;
}
public Puppy setName(String name) {
this.name = name;
return this;
}
public Puppy setColor(String color) {
this.color = color;
return this;
}
}
Puppy puppy = new Puppy();
puppy.setAge(1)
.setName("little")
.setColor("white");/<code>

是的,薛小小就是這樣一位神奇的小夥伴,能夠“化腐朽為神奇”,帶我們在學習基礎知識的過程中,不斷去探索更廣闊的編程世界,幫助我們從不同的角度看問題,幫助我們從一開始就養成追求代碼美感的好習慣。

多線程

多線程是一塊重要的知識點,它能幫助我們更高效地處理任務,但同時,我們也得保持警惕,避免陷入泥潭。

薛小小從“線程就好比是從事各種各樣生產工作的工人而進程就是這些工人的僱主”的比喻出發,帶我們創建學習路上的第一個線程。

  • 通過實現 Runnable 接口的 run 方法來創建線程。
<code>public class MachAuchWas implements Runnable {
@Override
public void run() {
System.out.println("Ich mach auch was!");
}
}/<code>
  • 繼承 Thread 類,通過重寫 run 方法來創建線程。
<code>public class MachWas extends Thread {
@Override
public void run() {
System.out.println("Ich mach was!");
}
} /<code>

作為初學者,在岔路口難免會疑惑,不知道該往何處去。別擔心,薛小小會告訴我們,使用實現 Runnable 接口的方式會更自由,可以去繼承其他的類,還可以創建匿名類。

在學會了線程的創建之後,他帶領我們去激活線程,讓我們瞭解線程的生命週期。

<code>public class Main {
\tpublic static void main(String[] args) {
\t\tnew MachWas().start();
\t\t(new Thread(new MachAuchWas())).start();
\t}
}/<code>

在此基礎上之上,作為一名對 Java 遊刃有餘的專業人士,薛小小還將帶領我們完成一個簡化版的魔獸世界(別擔心,在薛小小的世界裡,學習是一件輕鬆而愉悅的事情)。讓我們在實踐中學會正確使用線程。

如果你想要跟著薛小小一起親手實現這個小遊戲,那就快打開這本書吧。

Head First Java Plus

我喜歡將《薛小小學 Java》看作是一本 Plus 版的 Head First Java,它是一門更為優秀的 Java 從入門到精通導學書籍

Head First 這個系列對零基礎的新手來說,非常好,不會有太多的跳躍,也不會有太高的門檻,一切都恰如其分。但是,這個系列太舊了(至少對 Java 來說是這樣的),它所講述的是 Java 5 的世界,而距離 Java 5 發佈到現在,已經過去了十多年了。

對初學者來說,如果拿著十多年前的陳舊標準來學習一門語言,是性價比極低的一件事,甚至可能被那些“繁文縟節”所“勸退”。一項技術能夠被大規模採用,必然是簡單的、容易推廣普及的、能夠帶來大量生產力提升的。

因此,語言的不斷髮展,歸根到底是為了讓開發者生活的更美好,是為了不斷去降低語言學習和使用的成本

。同時,作為一門“藍領語言”,學的太新,可能也無法迎合市場的需要,畢竟, Java 11 可能仍然處於技術採用生命週期的早期採用者階段

因此,我更推薦跟著薛小小一起來學習 Java,學習那些被企業開發中大量使用的 Java 特性。不用擔心被“勸退”,更不用擔心學完以後無用武之地,一切都剛剛好。


分享到:


相關文章: