Java既是編譯型語言,又是解釋型語言
java源文件首先需要通過javac編譯生成后綴名為.class的字節碼文件(與平台無關,只面向JVM),然后使用Java虛擬機將字節碼解釋成特定平台上的機器碼運行。
Java虛擬機JVM
不同平台上的JVM不同,但是都提供了相同的接口。
開發Java准備
- 下載安裝Java8的JDK,並將jdk的安裝路徑添加到環境變量中。
- 開發Java需要安裝JDK,JDK包含Java編譯器(javac命令工具)、Java運行時環境(JRE)、常用的Java類庫等。
- JRE包含JVM,還包含類加載器、字節碼校驗器及大量的基礎類庫等環境支持。
- 如果只是運行Java程序,可以只安裝JRE。
第一個Java程序
- 編寫第一個著名的程序:HelloWorld。
pulic calss HelloWorld
{
public static void main(String[] args)
{
System.out.println("HelloWorld");
}
}
- 使用javac命令編譯java程序。
- 命令行輸入cmd,進入Java源文件所在的路徑
- 輸入如下命令,其中destdir是目標生成路徑
javac -d destdir HelloWorld.java
進入destdir路徑下,可以看到已經生成了后綴名為.class的字節碼文件
- 使用java命令解釋執行字節碼文件。
- 運行如下命令執行程序
java HelloWorld
- 運行如下命令執行程序
- 分析main()方法
- JVM需要調用main()方法來調用類,使用public修飾符將main暴露出來
- JVM通過該類來調用main()方法,沒有該類的對象,用static修飾
- 返回值給JVM,沒有意義
- 字符串數組形參,由JVM賦值
Java程序的基本規則
- Java是純面向對象的語言,類是Java程序的最小程序單位。
- javac可以編譯一個類,而解釋執行一個類則需要以main方法為入口,main方法的寫法是固定的。
- Java嚴格區分大小寫,類名首字母大寫,方法名第一個單詞首字母小寫,關鍵字小寫。
- 一個java源文件最多只能定義一個public類,因源文件名需要與public類的類名相同。
垃圾回收機制
- 顯式進行垃圾回收的缺點
- 忘記回收導致內存泄漏,降低系統性能
- 錯誤回收程序核心類庫的內存,導致系統崩潰
- Java虛擬機的堆內存用來保存類的對象,JVM的一個超級線程會進行檢測,如果一個對象長時間不被引用GC會釋放其所占用的內存空間,同時進行碎片整理將所占用的堆內存移到堆的一端,整理出新內存分配給其他對象。
- 使用GC的優點
- 提高編程效率
- 保護程序的完整性和安全性
- 使用GC的缺點
- 垃圾回收在cpu空閑或者內存不足時進行,影響程序性能
- GC的特點
- 只能回收JVM堆內存的內存空間,不能回收物理內存的資源
- 將對象的引用變量設置為null可以暗示GC回收該對象
- 使用GC回收對象之前,會先調用可恢復對象的finalize()方法可能將其變成可達狀態。
- 調用Runtime對象的gc()方法Runtime.getRuntime().gc()或者System.gc()僅僅是建議系統進行垃圾回收,不能精確控制
- 使用如下命令運行程序顯示每次垃圾回收后的提示信息
java -verbose:gc Test
- 平常用的基本是強引用對象,除此之外還有軟引用(SoftReferance,用於對內存敏感的程序中),弱引用(WeakReferance,不管內存強制回收),虛引用(PhantomReferance,只能和引用隊列一起使用跟蹤對象被垃圾回收的狀態)。
使用IDE工具
- 下載安裝Eclipse開發工具
- 配置自動補全
Windows-Preferences-Java-Editor-Content Asist,將Auto activation triggers for Java改為“.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”即可 - 熟悉快捷鍵
自動導入相關包:Ctrl+Shift+O
使用jar命令
- 創建jar包
jar cvf test.jar test
- 查看jar包
jar tvf test.jar
- 解壓縮jar包
jar xvf test.jar
- 更新jar包里的文件
jar uvf test.jar Filename
發布Java應用程序
- 利用Windows批處理,添加如下執行命令
java package.MainClass
不顯示命令行窗口用以下命令
start javaw package.MainClass
- 創建可執行jar包
指定主類的類名作為程序入口
jar cvfe test.jar package.MainClass test
運行上面的jar包命令java -jar test.jar
或者javaw test.jar
獲得用戶輸入
- 給main()方法字符串數組形參賦值
運行Java程序時在類名后緊跟一個或多個字符串,用空格隔開,則JVM將這些字符串依次賦值給args數組元素
java test str1 str2 str3
- 使用Scanner類從文件、輸入流、字符串中解析數據,它提供了兩個方法:
- 判斷是否還有下一項基本數據/字符串/一行:hasNextInt()、hasNext()、hasNextLine()
- 獲取下一個輸入項:nextInt()、next()、nextLine()
- 默認使用空白符作為分隔符,可以使用
useDelimiter("\n")
方法自定義分隔符
下面的示例程序涉及文件輸入,並沒有進行異常處理及文件關閉!
//獲取鍵盤輸入
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = (String) sc.next();
System.out.println("str");
}
//獲取文件輸入
Scanner sca = new Scanner("Test.java");
//使用回車作為分隔符
sca.useDelimiter("\n");
while (sca.hasNext()) {
String str = (String) sca.next();
System.out.println("str");
}