聊一聊 Java 面向對象
前言
在之前的文章中,講到了面向的 3 大特性(封裝、繼承、多態)和面向對象設計的 5 大原則(SRP、OCP、LSP、DIP、ISP)。此外,我們還講了如何創建一個類,并且在創建類后如何構造一個對象。然后還介紹了類中的屬性和方法,并對構造方法和引用也做了簡單的講解。
有了上面的基礎之后,今天我們來繼續學習面向對象的相關知識,主要內容預告如下:
- 包
- 注釋
- jar 文件的創建
包
假設現在有這么一種情況,諸葛亮、周瑜、曹操共同開發一款程序。其中,周瑜和曹操均在自己代碼模塊中寫了一個 PublicUtil 類,現在諸葛亮要調用周瑜和曹操模塊中代碼,需要同時用到他們中的 PublicUtil 類,這時候就犯難了,諸葛亮在他的代碼中使用 PublicUtil 類時,該怎么區分是調用周瑜的,還是調用的曹操的呢?
針對這個問題,開發 Java 的前輩們當然也想到了。于是,他們在 Java 中定義了一種名字空間,也就是我們今天要講的包:package。通過使用包機制,就十分容易區別類名的命名空間了。
假設曹操的 PublicUtil 類代碼如下:
// 申明包名package caocao;public class PublicUtil{ ……}
周瑜的 PublicUtil 類代碼如下:
// 申明包名package zhouyu;public class PublicUtil{ ……}
此時,如果諸葛亮要同時使用他們倆代碼中的 PublicUtil 類,此時就可以通過引入他們倆的包,然后通過使用 包名.類名 的引用方式來進行區分即可。
package zhugeliang;import caocao;import zhouyu;public class Util{ // 使用周瑜代碼 zhouyu.PublicUtil.xxx(); …… // 使用曹操代碼 caocao.PublicUtil.xxx(); ……}
以上代碼中的 import 你可能也在其他代碼中見到過,但你不知道啥作用。其實它就是為了包的使用而生,如果我要使用另一個人的包,那該怎么做呢?其實很簡單,只需要在程序中使用關鍵字 import 即可完成包的導入。
通過使用包,可以達到以下的作用:
- 將功能類似或或相關的類以及接口組織放在同一個包中,方便類的查找與使用。
- 包也像文件夾一樣,采用了樹形目錄的存儲方式。同一個包中的類名不同,不同包中的類名可以相同。當同時調用兩個不同包中的同一類名的類時,通過加上完整的包名就可以加以區分,從而避免類名沖突。
- 同時包也限定了訪問權限,只有擁有包訪問權限的類才能間接去訪問包中的類。
注釋
所謂注釋,就是寫在程序里邊對代碼進行結束說明的文字,既方便自己也方便他人查看,更快理解程序含義。而且注釋是不影響程序的執行的,在我們對 Java 源代碼進行編譯后,字節碼文件中不含源代碼中的注釋內容。
在 Java 中,通常支持三種注釋方式,它們分別是:
- //:單行注釋
- /* */:多行注釋
- /** */:文檔注釋
單行注釋
單行注釋是以雙斜杠 // 來標識,表示只注釋當前行內容,一般用在需要注釋的內容較少的地方,以下就是一個單行注釋的實例。
// 第一個 Java 程序public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); }}
多行注釋
通常我們把要注釋的內容放在 /* 和 */ 之間,表示在兩者之間的內容都是我們的注釋內容,以下是一個多行注釋的實例。
/** 第一個 Java 程序* 這是許多初學者都會寫的一個程序*/public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); }}
文檔注釋
文檔注釋和多行注釋很像,它是將我們所需要注釋的內容包含在 /** 和 */ 之間。而文檔注釋和其他兩種注釋最大的區別就在于:我們可以利用 javadoc 工具來提取文檔注釋,然后生成一個 HTML 文檔,類似于 Java 官網所提供的 API 文檔,以下是一個文檔注釋的實例。
/*** 第一個 Java 程序* 這是許多初學者都會寫的一個程序*/public class HelloWorld{ /** * 主函數 * @param args 主函數參數列表 */ public static void main(String[] args){ System.out.println("Hello World!"); }}
然后我們通過終端,使用 javadoc 命令就可以為上述文件生成一個 HTML 文檔。
javadoc HelloWorld.java
而文檔注釋相比于其他兩種注釋,也有更多值得注意的地方,下面就分別來看看需要留意的地方。
1、常用文檔注釋分類
- ?類注釋
顧名思義,所謂類注釋,就是針對整個類的說明,它必須放在 import 之后,但又必須放在類定義之前。以下是一個類注釋的實例:
/*** Animal,動物類*/public class Animal{ ...}
這里需要注意的是,在 /** 和 */ 之間的其他行注釋,* 是可有可無的,之所以加上,更大情況出于美觀的考慮,上面的實例寫成如下樣式也是合法的。
/** Animal,動物類*/public class Animal{ ...}
- 方法注釋
同樣的,方法注釋也就是針對類中方法的注釋,它必須放在所描述的方法之前。而一般情況下,除開說明該方法的功能之外,我們經常使用如下標記來對方法進行注釋。
標記說明@param variable description用于介紹當前方法的參數,可以占據多行@return description用于描述當前方法的返回值,可以跨多行@throws class description用于表示該方法有可能拋出的異常。
以下就是一個方法注釋的實例:
/*** 求兩數之h* @param num1 加數1* @param num2 加數2@ return 兩數之和*/public int add(int num1, int num2){ return num1 + num2;}
- 字段注釋
字段注釋顧名思義,也就是對于類中字段的說明,用于描述字段的含義,以下是一個字段注釋的例子。
public class Cunyu{ /** * 公眾號 */ public String wePublic;}
當然,如果你不喜歡把一個字段的注釋分成多行的話,也可以寫成以下格式。
public class Cunyu{ /**公眾號*/ public String wePublic;}
兩種方式都是可以的,也沒有優劣之分,可以根據自己的風格來選擇。但是在 IntelliJ IDEA 等 IDE 中,如果對代碼進行格式化,IDEA 會將第二種方式格式化成第一種方式,這一點需要注意。
2、如何提取文檔注釋
假設有以下一段代碼,我們需要生成關于代碼的文檔說明。那么就可以使用 JDK 中所提供的 javadoc 命令來提取代碼的文檔注釋。
/*** 第一個 Java 程序* 這是初學者基本都會寫的一個程序* @author 村雨遙* @version 1.0*/public class HelloWorld { /** * 主函數:程序入口 * @param args 主函數參數列表 */ public static void main(String[] args){ System.out.println("Hello World!"); }}
然后利用以下命令就可以生成我們的文檔注釋。
javadoc -d helloworld -author -version -encoding UTF-8 HelloWorld.java
以上命令的意思就是,對名為 HelloWorld.java 的提取其中的文檔注釋,并將輸出的文件放在 helloworld 文件夾下,并且在文檔中包含程序作者和版本,編碼方式為 UTF-8。
生成的文件列表詳情見下圖,打開其中的 index.html 就可以查看提取的文檔注釋。
jar 文件的創建
其實關于這個,我在之前的文章也寫過。不過我是利用 IntelliJ IDEA 來對進行代碼的打包,如果感興趣,可以點擊下方傳送門去看看。
如何利用 IntelliJ IDEA 創建 Java 入門應用[1]。
不過那是借助工具來生成的,今天我們來看看如何利用 JDK 所提供的命令行工具,來創建一個能打印出 Hello World! 的 jar 包。
同樣的,我們仍然是需要先準備一個能輸出 Hello World! 的 Java 源代碼,命名為 HelloWorld.java。
public class HelloWorld { public static void main(String[] args){ System.out.println("Hello World!"); }}
接著,利用 javac 命令對該文件進行編譯,然后會生成 HelloWorld.class 字節碼文件。
javac HelloWorld.java
然后,利用 jar 命令來對生成的字節碼文件進行打包。
jar -cvf hello.jar HelloWorld.class
其中 c 表示創建一個新 jar 包,v 表示創建過程中打印創建過程中的信息,f 則表示對新生成的 jar 命名。
最后,利用以下命令來運行 jar 包。
java -jar hello.jar
不過并不會順利出現我們想要的結果,此時會報錯 hello.jar 中沒有主清單屬性。這是因為我們還沒有在 MENIFEST.MF 文件中添加 Main-Class 屬性。
用壓縮軟件打開剛創建的 hello.jar,里邊除了 HelloWorld.class 文件之外,還會多一個 META-INF 文件夾,里邊還有一個 MENIFEST.MF 文件,此時我們只需要用編輯器打開該文件,然后在文件中加入以下代碼。(記得添加之后要保證整個文件最后保留一行空行)。
Main-Class: HelloWorld
添加完成之后,再次運行 java -jar hello.jar ,就可以成功在控制臺打印 Hello World! 了。
參考資料
[1]如何利用 IntelliJ IDEA 創建 Java 入門應用: https://cunyu1943.github.io/JavaPark/dev-tools/idea/java-quick-start-with-idea。