JAVA 從入門到放棄 (1):入門

  • 2020 年 3 月 10 日
  • 筆記

JAVA 從入門到放棄 (1)

課程計劃源於廖雪峰的java教程。筆記的大部分內容都不是我寫的,不過記下的demo至少是我親自跑過的。整個課程大概計劃寫20篇筆記,涉及Java SE的各方面。每周計劃1-2篇,估計業餘時間學完前前後後幾個月。當然,也可能寫着寫着就放棄了。 做這個計劃不是為了成為後端,只是目前工作環境高度依賴Java,如果不會其實很糾結。另一方面,也想無障礙拜讀一下Java寫的一些開源項目和經典書籍。 即便真放棄了,也不用擔心,沒有放棄前的內容,包括修訂的內容將在會在本公眾號的關聯小程序(麥子文檔)中找到。

1. 認識 java

1.1 為什麼選擇java

•開發語言top1,最大的開發社區,最多廠商支持•面向企業和互聯網後端開發/Android開發/大數據開發(主要有Hadoop、Spark、Flink等,他們都是Java或Scala(一種運行於JVM的編程語言)開發)等,這意味着Java擁有最廣泛的就業市場。•Java工程師也是市場需求最大的軟件工程師•上手後掌握其它語言相當容易

從互聯網到企業平台,Java是應用最廣泛的編程語言,原因在於:

•Java是基於JVM虛擬機的跨平台語言,一次編寫,到處運行;•Java程序易於編寫,以位元組碼運行在虛擬機上,而且有內置垃圾收集,不必考慮內存管理;•自帶功能齊全的類庫•Java虛擬機擁有工業級的穩定性和高度優化的性能,且經過了長時期的考驗;•Java擁有非常活躍的開源社區支持,各種高質量組件隨時可用。

1.2 java的優缺點

優點在於:

•簡單,健壯,安全•跨平台:一次編寫,到處運行•高度優化虛擬機

缺點在於:

•語法繁瑣=>寫起來慢•無法直接操作硬件=>因此不太適合開發底層操作系統•GUI效果不佳=>因此不太適合桌面應用,桌面大型遊戲開發

1.3 學習目標

java會過時嗎?沒有什麼編程語言是不會過時的,但相對於前端開發技術兩年一大變相比,java工程師憑自身技能吃個10年沒問題,本系列文章學習java,主要是:

•了解java平台的開發能力•學習其程序設計思想。架構思維(模塊化開發,設計模式)和開源項目的學習能力,•培養優秀的工程習慣和編碼能力(ide技巧,代碼風格,調試方法等)

1.4 簡介

Java最早是由SUN公司(已被Oracle收購)的詹姆斯·高斯林[1](高司令,人稱Java之父)在上個世紀90年代初開發的一種編程語言,最初被命名為Oak,目標是針對小型家電設備的嵌入式應用,結果市場沒啥反響。誰料到互聯網的崛起,讓Oak重新煥發了生機,於是SUN公司改造了Oak,在1995年以Java的名稱正式發佈,原因是Oak已經被人註冊了,因此SUN註冊了Java這個商標。隨着互聯網的高速發展,Java逐漸成為最重要的網絡編程語言。

Java介於編譯型語言和解釋型語言之間。編譯型語言如C、C++,代碼是直接編譯成機器碼執行,但是不同的平台(x86、ARM等)CPU的指令集不同,因此,需要編譯出每一種平台的對應機器碼。解釋型語言如Python、Ruby沒有這個問題,可以由解釋器直接加載源碼然後運行,代價是運行效率太低。而Java是將代碼編譯成一種「位元組碼」,它類似於抽象的CPU指令,然後,針對不同平台編寫虛擬機,不同平台的虛擬機負責加載位元組碼並執行,這樣就實現了「一次編寫,到處運行」的效果。當然,這是針對Java開發者而言。對於虛擬機,需要為每個平台分別開發。為了保證不同平台、不同公司開發的虛擬機都能正確執行Java位元組碼,SUN公司制定了一系列的Java虛擬機規範。從實踐的角度看,JVM的兼容性做得非常好,低版本的Java位元組碼完全可以正常運行在高版本的JVM上。

隨着Java的發展,SUN給Java又分出了三個不同版本:

•Java SE:Standard Edition 標準版•Java EE(J2E):Enterprise Edition 企業版•Java ME:Micro Edition 精簡移動版(注意,當前在安卓移動設備上開發的java版本並非java ME)

這三者之間的關係是:

┌───────────────────────────┐  │Java EE                    │  │    ┌────────────────────┐ │  │    │Java SE             │ │  │    │    ┌─────────────┐ │ │  │    │    │   Java ME   │ │ │  │    │    └─────────────┘ │ │  │    └────────────────────┘ │  └───────────────────────────┘

簡單來說,Java SE就是標準版,包含標準的JVM和標準庫,而Java EE是企業版,它只是在Java SE的基礎上加上了大量的API和庫,以便方便開發Web應用、數據庫、消息服務等,Java EE的應用使用的虛擬機和Java SE完全相同。

Java ME就和Java SE不同,它是一個針對嵌入式設備的「瘦身版」,Java SE的標準庫無法在Java ME上使用,Java ME的虛擬機也是「瘦身版」。

毫無疑問,Java SE是整個Java平台的核心,而Java EE是進一步學習Web應用所必須的。我們熟悉的Spring等框架都是Java EE開源生態系統的一部分。不幸的是,Java ME從來沒有真正流行起來,反而是Android開發成為了移動平台的標準之一,因此,沒有特殊需求,不建議學習Java ME。

因此推薦的Java學習路線圖如下:

1.首先要學習Java SE,掌握Java語言本身、Java核心開發技術以及Java標準庫的使用;2.如果繼續學習Java EE,那麼Spring框架、數據庫開發、分佈式架構就是需要學習的;3.如果要學習大數據開發,那麼Hadoop、Spark、Flink這些大數據平台就是需要學習的,他們都基於Java或Scala開發;4.如果想要學習移動開發,那麼就深入Android平台,掌握Android App開發。

無論怎麼選擇,Java SE的核心技術是基礎。

1.5 Java版本

從1995年發佈1.0版本開始,到目前為止,最新的Java版本是Java13:

時間

版本

1995

1.0

1998

1.2

2000

1.3

2002

1.4

2004

1.5 / 5.0

2005

1.6 / 6.0

2011

1.7 / 7.0

2014

1.8 / 8.0

2017/9

1.9 / 9.0

2018/3

10

2018/9

11

2019/3

12

2019/9

13

本教程使用的Java版本基於Java 13。還會涉及一些13的內容。

名詞解釋 初學者學Java,經常聽到JDK、JRE這些名詞,它們到底是啥? •JDK:Java Development Kit•JRE:Java Runtime Environment 簡單地說,JRE就是運行Java位元組碼的虛擬機。但是,如果只有Java源碼,要編譯成Java位元組碼,就需要JDK,因為JDK除了包含JRE,還提供了編譯器、調試器等開發工具。 如圖為java的運行平台流程:

要學習Java開發,當然需要安裝JDK了。 那JSR、JCP……又是啥? •JSR規範:Java Specification Request•JCP組織:Java Community Process (負責維護規範) 為了保證Java語言的規範性,SUN公司搞了一個JSR規範,凡是想給Java平台加一個功能,比如說訪問數據庫的功能,大家要先創建一個JSR規範,定義好接口,這樣,各個數據庫廠商都按照規範寫出Java驅動程序,開發者就不用擔心自己寫的數據庫代碼在MySQL上能跑,卻不能跑在PostgreSQL上。 所以JSR是一系列的規範,從JVM的內存模型到Web程序接口,全部都標準化了。而負責審核JSR的組織就是JCP。 一個JSR規範發佈時,為了讓大家有個參考,還要同時發佈一個「參考實現」,以及一個「兼容性測試套件」: •RI:Reference Implementation•TCK:Technology Compatibility Kit 比如有人提議要搞一個基於Java開發的消息服務器,這個提議很好啊,但是光有提議還不行,得貼出真正能跑的代碼,這就是RI。如果有其他人也想開發這樣一個消息服務器,如何保證這些消息服務器對開發者來說接口、功能都是相同的?所以還得提供TCK。 通常來說,RI只是一個「能跑」的正確的代碼,它不追求速度,所以,如果真正要選擇一個Java的消息服務器,一般是沒人用RI的,大家都會選擇一個有競爭力的商用或開源產品。 參考:Java消息服務JMS的JSR:https://jcp.org/en/jsr/detail?id=914

本教程開發環境:win 10 / Mac OS 10.16 ,OracleJDK,eclipse編輯器


2. 安裝JDK

因為Java程序必須運行在JVM之上,所以,我們第一件事情就是安裝JDK。

搜索JDK,確保從Oracle的官網[2]下載最新的穩定版JDK,找到Java SE 13.x的下載鏈接,下載直接安裝即可。

2.1 設置環境變量

安裝完JDK後,需要設置一個JAVA_HOME的環境變量,它指向JDK的安裝目錄。在Windows下,它是安裝目錄,類似:

C:Program FilesJavajdk-13.0.2

在Mac下,它在~/.bash_profile里,它是:

export JAVA_HOME=`/usr/libexec/java_home -v 13`

然後,把JAVA_HOMEbin目錄(C:Program FilesJavajdk-13.0.2bin)附加到系統環境變量PATH上。在Windows下,它長這樣:

Path=%JAVA_HOME%bin;<現有的其他路徑>

在Mac下,它在~/.bash_profile里,長這樣:

export PATH=$JAVA_HOME/bin:$PATH

WIN10:控制面板-系統-高級系統設置-高級-環境變量

在系統變量新建變量名JAVA_HOME,

變量值為jdk安裝目錄,默認是

C:Program FilesJavajdk-13.0.2

編輯系統變量的Path,新建文本內容為

%JAVA_HOME%bin  # 或者  C:Program FilesJavajdk-13.0.2bin

確定-確定-確定

JAVA_HOMEbin目錄添加到PATH中是為了在任意文件夾下都可以運行java。打開命令提示符窗口,輸入命令java -version,如果一切正常,你會看到如下輸出:

如果你看到的版本號不是13,而是121.8之類,說明系統存在多個JDK,且默認JDK不是JDK 13。

可以參考如何設置或更改PATH系統變量[3]。

2.2 程序理解

細心的童鞋還可以在JAVA_HOMEbin目錄下找到很多可執行文件:

•java:這個可執行程序其實就是JVM,運行Java程序,就是啟動JVM,然後讓JVM執行指定的編譯後的代碼;•javac:這是Java的編譯器,它用於把Java源碼文件(以.java後綴結尾)編譯為Java位元組碼文件(以.class後綴結尾);•jar:用於把一組.class文件打包成一個.jar文件,便於發佈;•javadoc:用於從Java源碼中自動提取注釋並生成文檔;•jdb:Java調試器,用於開發階段的運行調試。


3 第一段java程序

3.1 hello world

每一個偉大,必定伴隨着hello world的哭喊聲來到這個世界。接下來寫一個helloworld。

新建一個hello.java文件,

public class Hello{      public static void main(Sring[] args){          System.out.println("hello world");      }  }

這個定義被稱為class(類),這裡的類名是Hello,大小寫敏感,class用來定義一個類,public表示這個類是公開的,publicclass都是Java的關鍵字,必須小寫,Hello是類的名字,按照習慣,首字母H要大寫。而花括號{}中間則是類的定義。

注意到類的定義中,我們定義了一個名為main的方法:

    public static void main(String[] args) {          ...      }

方法是可執行的代碼塊,一個方法除了方法名main,還有用()括起來的方法參數,這裡的main方法有一個參數,參數類型是String[],參數名是argspublicstatic用來修飾方法,這裡表示它是一個公開的靜態方法,void是方法的返回類型,而花括號{}中間的就是方法的代碼。

方法的代碼每一行用;結束,這裡只有一行代碼,就是:

 System.out.println("Hello, world!");

它用來打印一個字符串到屏幕上。

Java規定,某個類定義的public static void main(String[] args)是Java程序的固定入口方法,因此,Java程序總是從main方法開始執行。

注意到Java源碼的縮進不是必須的,但是用縮進後,格式好看,很容易看出代碼塊的開始和結束,縮進一般是4個空格或者一個tab。

最後,當我們把代碼保存為文件時,文件名必須是Hello.java,而且文件名也要注意大小寫,因為要和我們定義的類名Hello完全保持一致。

3.2 如何運行Java程序

Java源碼本質上是一個文本文件,我們需要先用javacHello.java編譯成位元組碼文件Hello.class,然後,用java命令執行這個位元組碼文件:

┌──────────────────┐  │    Hello.java    │<─── 源碼  └──────────────────┘            │ compile            ▼  ┌──────────────────┐  │   Hello.class    │<─── 位元組碼  └──────────────────┘            │ execute            ▼  ┌──────────────────┐  │    Run on JVM    │<─── 虛擬機  └──────────────────┘

因此,可執行文件javac是編譯器,而可執行文件java就是虛擬機。

第一步,在保存Hello.java的目錄下執行命令javac Hello.java

$ javac Hello.java

如果源代碼無誤,上述命令不會有任何輸出,而當前目錄下會產生一個Hello.class文件:

$ ls  Hello.class    Hello.java

第二步,執行Hello.class,使用命令java Hello

$ java Hello  Hello, world!

注意:給虛擬機傳遞的參數Hello是我們定義的類名,虛擬機自動查找對應的class文件並執行。

有一些童鞋可能知道,直接運行java Hello.java也是可以的:

$ java Hello.java  Hello, world!

這是Java 11新增的一個功能,它可以直接運行一個單文件源碼!

需要注意的是,在實際項目中,單個不依賴第三方庫的Java源碼是非常罕見的,所以,絕大多數情況下,我們無法直接運行一個Java源碼文件,原因是它需要依賴其他的庫。

3.3 小結

•一個Java源碼只能定義一個public類型的class,並且class名稱和文件名要完全一致;•使用javac可以將.java源碼編譯成.class位元組碼;•使用java可以運行一個已編譯的Java程序,參數是類名。


4 IDE

IDE是集成開發環境:Integrated Development Environment的縮寫。

使用IDE的好處在於按,可以把編寫代碼、組織項目、編譯、運行、調試等放到一個環境中運行,能極大地提高開發效率。

IDE提升開發效率主要靠以下幾點:

•編輯器的自動提示,可以大大提高敲代碼的速度;•代碼修改後可以自動重新編譯,並直接運行;•可以方便地進行斷點調試。

目前,流行的用於Java開發的IDE有:

Eclipse

Eclipse[4]是由IBM開發並捐贈給開源社區的一個IDE,也是目前應用最廣泛的IDE。Eclipse的特點是它本身是Java開發的,並且基於插件結構,即使是對Java開發的支持也是通過插件JDT實現的。

除了用於Java開發,Eclipse配合插件也可以作為C/C++開發環境、PHP開發環境、Rust開發環境等。

IntelliJ Idea

IntelliJ Idea[5]是由JetBrains公司開發的一個功能強大的IDE,分為免費版和商用付費版。JetBrains公司的IDE平台也是基於IDE平台+語言插件的模式,支持Python開發環境、Ruby開發環境、PHP開發環境等,這些開發環境也分為免費版和付費版。

4.1 使用Eclipse

你可以使用任何IDE進行Java學習和開發。我們不討論任何關於IDE的優劣,本教程使用Eclipse作為開發演示環境,原因在於:

•完全免費使用;•所有功能完全滿足Java開發需求。

4.1.1安裝Eclipse

Eclipse的發行版提供了預打包的開發環境,包括Java、JavaEE、C++、PHP、Rust等。從這裡[6]下載:

我們需要下載的版本是Eclipse IDE for Java Developers(IE7 風格界面):

根據操作系統是Windows、Mac還是Linux,從右邊選擇對應的下載鏈接。

4.2 設置Eclipse

下載並安裝完成後,我們啟動Eclipse,對IDE環境做一個基本設置:

選擇菜單「Eclipse/Window」-「Preferences」,打開配置對話框:

我們需要調整以下設置項:

General > Editors > Text Editors

鉤上「Show line numbers」,這樣編輯器會顯示行號;

General > Workspace

鉤上「Refresh using native hooks or polling」,這樣Eclipse會自動刷新文件夾的改動;

對於「Text file encoding」,如果Default不是UTF-8,一定要改為「Other:UTF-8」,所有文本文件均使用UTF-8編碼;

對於「New text file line delimiter」,建議使用Unix,即換行符使用n而不是Windows的rn

Java > Compiler

將「Compiler compliance level」設置為13,本教程的所有代碼均使用Java 13的語法,並且編譯到Java 13的版本。

去掉「Use default compliance settings」並鉤上「Enable preview features for Java 13」,這樣我們就可以使用Java 13的預覽功能。

Java > Installed JREs

在Installed JREs中應該看到Java SE 13,如果還有其他的JRE,可以刪除,以確保Java SE 13是默認的JRE。

4.3 Eclipse IDE結構

打開Eclipse後,整個IDE由若干個區域組成:

•中間可編輯的文本區(見1)是編輯器,用於編輯源碼;•分佈在左右和下方的是視圖:•Package Exploroer(見2)是Java項目的視圖•Console(見3)是命令行輸出視圖•Outline(見4)是當前正在編輯的Java源碼的結構視圖•視圖可以任意組合,然後把一組視圖定義成一個Perspective(見5),Eclipse預定義了Java、Debug等幾個Perspective,用於快速切換。

4.4 新建Java項目

在Eclipse菜單選擇「File」-「New」-「Java Project」,填入HelloWorld,JRE選擇Java SE 13

點擊next,暫時不要勾選「Create module-info.java file」,因為模塊化機制我們後面才會講到:

點擊「Finish」就成功創建了一個名為HelloWorld的Java工程。

4.5 新建Java文件並運行

展開HelloWorld工程,選中源碼目錄src,點擊右鍵,在彈出菜單中選擇「New」-「Class」:

在彈出的對話框中,Name一欄填入Hello

點擊」Finish「,就自動在src目錄下創建了一個名為Hello.java的源文件。我們雙擊打開這個源文件,填上代碼:

一鍵格式化:ctrl+shift+F ,如果不生效可能是輸入法干擾。此外,也可以右鍵-source-format 右鍵hello.java ,show in system explore ,可以看到你的Java工程

保存,然後選中文件Hello.java,點擊右鍵,在彈出的菜單中選中「Run As…」-「Java Application」:

Console窗口中就可以看到運行結果:

如果沒有在主界面中看到Console窗口,請選中菜單「Window」-「Show View」-「Console」,即可顯示。


* 5 安裝eclipse插件

本教程提供一個Eclipse IDE的練習插件,可以非常方便地下載練習代碼。

安裝IDE練習插件

啟動Eclipse,選擇菜單「Help」-「Install New Software…-「add」,在打開的對話框中:

點擊「Add」,對Name填寫一個任意的名稱,例如「Java Practice Plugin」,對於Location,填入https://liaoxuefeng.gitee.io/learn-java-update-site/,然後點擊「Add」添加:

在列表中選中「Java Practice Feature」,然後點擊「Next」安裝。

在安裝過程中,由於插件代碼沒有數字簽名,所以會彈出一個警告:

選擇「Install anyway」繼續安裝,安裝成功後,根據提示重啟Eclipse即可。

重啟Eclipse後,選擇菜單「Window」-「Show View」-「Other…」:

在彈出的對話框中選擇「Java」-「Java Practice」,然後點擊「Open」,即可在Eclipse中看到Java Practice插件:

導入練習

在「Java Practice」面板中,雙擊hello.zip,按照提示導入工程,即可直接下載並導入到Eclipse中:

References

[1] 詹姆斯·高斯林: https://en.wikipedia.org/wiki/James_Gosling [2] Oracle的官網: https://www.oracle.com/technetwork/java/javase/downloads/index.html [3] 如何設置或更改PATH系統變量: https://www.java.com/zh_CN/download/help/path.xml [4] Eclipse: https://www.eclipse.org/ [5] IntelliJ Idea: https://www.jetbrains.com/idea/ [6] 這裡: https://www.eclipse.org/downloads/packages/