:Java 程序的基本骨架——main 方法、類、包與變量聲明)
開篇先看一段活的代碼學 Java 的第一課我們不寫HelloWorld。玩具代碼看不出 Java 的骨架長什么樣。直接上一個小型但完整的程序——煤礦井下設備巡檢登記這是真實業務的簡化版package com.demo.inspection; import java.time.LocalDate; public class InspectionApp { public static void main(String[] args) { // 設備基本信息 String deviceName 3號皮帶輸送機; String location 井下-580m東翼大巷; int runtimeHours 1260; double temperature 42.5; boolean needRepair false; // 簡單的巡檢邏輯 if (temperature 45.0) { needRepair true; } // 輸出巡檢報告 System.out.println( 設備巡檢報告 ); System.out.println(設備名稱 deviceName); System.out.println(安裝位置 location); System.out.println(累計運行 runtimeHours 小時); System.out.println(當前溫度 temperature ℃); System.out.println(巡檢日期 LocalDate.now()); System.out.println(是否需維修 (needRepair ? 是 : 否)); } }把這段代碼存成InspectionApp.java編譯運行控制臺就會打印出一份巡檢報告。別小看這二十幾行——Java 程序的骨架要素全在里面了package、import、類、main 方法、變量聲明、運算符、三元表達式、控制臺輸出。下面逐層拆開講。第一層package——Java 代碼的戶口本package com.demo.inspection;Java 里所有的類都必須有歸屬這個歸屬就是包package。它解決一個樸素的問題全世界的程序員都在寫 Java類名撞車怎么辦答案是按包名隔離。包名習慣上用公司域名倒寫開頭com.demo.inspection就是demo.com這家公司的 inspection 模塊。這樣幾乎不可能和別人撞名。包名和磁盤上的目錄結構一一對應這個類必須放在com/demo/inspection/這樣的目錄下。一個.java文件的開頭第一行注釋除外就是 package 聲明全小寫這是鐵打的習慣。類比前端package 之于 Java就像 ES Module 的目錄路徑之于 TypeScript——給代碼一個唯一的命名空間。第二層import——用別人寫的類先打招呼import java.time.LocalDate;LocalDate是 JDK 自帶的日期類但它住在java.time這個包里不在我們自己的包里。要用它就得在文件開頭 import 一下相當于 TypeScript 里的import { LocalDate } from java.time。幾個要點只有跨包使用才需要 import。同一個包里的類直接用不用打招呼。java.lang包是特例String、System、Math這些最基礎的類住在這里自動引入不用寫 import。import 只是聲明引用不會把代碼復制進來寫多了也不用擔心體積。第三層類——Java 世界里一切的容器public class InspectionApp { // ... }這是 Java 和前端最不一樣的地方先立一個規矩在 Java 里不允許存在游離的代碼。任何變量、任何方法都必須裝在某一個類里面。TypeScript 里你可以隨手在文件頂層寫console.log(hello)Java 不行——報錯的。所有代碼都是類的成員。關于類的聲明這一行里有三個詞public訪問修飾符表示這個類任何人都能用。現階段記住入口類寫成 public 就行修飾符的細節留到第六章專門講。class聲明這是一個類的關鍵字。InspectionApp類名約定大駝峰首字母大寫。還有一個硬規定一個 .java 文件里如果有一個 public 類文件名必須和這個類名一模一樣——類叫InspectionApp文件就必須叫InspectionApp.java差一個字母都編譯不過。第四層main 方法——程序的入口咒語public static void main(String[] args) {每個 Java 初學者都背過這串咒語。現在把它拆成五個詞一次講透表格詞含義為什么需要它public公開的JVM 要從外部調用這個方法啟動程序必須 publicstatic靜態的程序剛啟動時還沒有任何對象JVM 沒法new 一個實例再調方法所以入口方法必須屬于類本身而不是屬于某個對象void無返回值程序跑完就結束了返回值沒人接收所以是 voidmain方法名這是 JVM 認準的入口名字改一個字 JVM 就找不到入口了String[] args字符串數組參數命令行啟動程序時可以傳參數比如java InspectionApp 設備A這個設備A就會進 args 數組一句話總結main 方法就是一個公開的、屬于類的、沒有返回值的、名叫 main 的、接收字符串數組參數的方法五個條件缺一不可這是 JVM 和你的約定。方法體的{}里面就是程序真正執行的代碼從上往下逐行運行。第五層變量聲明——Java 是先聲明類型再使用的語言看 main 方法里的這幾行String deviceName 3號皮帶輸送機; int runtimeHours 1260; double temperature 42.5; boolean needRepair false;Java 是靜態強類型語言變量的類型在編譯時就定死聲明格式永遠是類型 變量名 初始值;變量名約定小駝峰首字母小寫如runtimeHours。int裝整數double裝小數boolean只有true/false兩個值注意全小寫和 JS 一致和 C# 的bool寫法不同。String裝文本注意首字母大寫——它不是基本類型而是一個類。這個區別很重要第二章會專門展開。字符串必須用雙引號。Java 里單引號是給單個字符char用的A合法abc直接編譯報錯。這點和 JS/TS 單雙引號隨便用的習慣不同初期很容易寫錯。上面代碼里還有幾個小語法點順帶認識一下if (temperature 45.0) { needRepair true; }if寫法和 C 系語言完全一致條件必須放括號里且必須是 boolean——Java 里沒有0 當 false、非 0 當 true這一說if (1)直接編譯報錯比 C 嚴謹。System.out.println(是否需維修 (needRepair ? 是 : 否));System.out.println(...)控制臺輸出并換行相當于console.log。還有一個System.out.print(...)不換行。號字符串拼接累計運行 runtimeHours會自動把 int 拼成字符串。條件 ? 值1 : 值2三元表達式和 JS 里一模一樣。常踩的坑新手排雷清單文件名和 public 類名不一致類叫InspectionApp文件卻存成inspectionapp.java或別的名字——編譯直接報錯。這是新手第一天必踩的坑。字符串用了單引號設備報錯。記死單引號只能包一個字符文本一律雙引號。語句末尾忘了分號Java 每條語句必須以;結尾。TypeScript 里分號可有可無Java 里沒有商量。類名、方法名大小寫寫錯Java嚴格區分大小寫Main和main是兩個東西。寫成public static void Main(...)JVM 會說找不到入口。在類的外面寫語句比如把System.out.println寫到類的花括號外面——不允許所有代碼必須待在類里、方法里。import 了卻沒用到或忘了 import忘記 import 編譯報錯好理解反過來import 了沒用的類不報錯但正規項目里會被代碼檢查工具標黃養成隨用隨 import 的習慣。本章小結這一章我們借一段巡檢登記程序認識了 Java 程序的完整骨架package給類一個唯一的戶口本import聲明要用到的外部類類是 Java 世界里一切的容器代碼不許游離public static void main(String[] args)是 JVM 認準的程序入口五個要素缺一不可變量必須先聲明類型再使用類型在編譯期定死語句以分號結尾。下一章我們往里走一步八種基本類型與 String——Java 類型世界的兩大陣營以及新手第二個必踩的坑為什么用比較兩個內容相同的字符串結果可能是 false。