1.概念
JVM:Java虛擬機,.class最終運行於此;
JRE:Java運行環境,包含JVM和JAVA類庫(如java.util);
JDK:Java開發工具包,包含JRE和一些工具(如javac.exe)。
JVM∈JRE∈JDK
如果不編譯只運行只需JRE即可,如果要編譯就要JDK。
2.安裝JDK
Oracle收購了Sun,現在Java屬於Oracle
去Oracle官網下載JDK:https://www.oracle.com/technetwork/java/javase/downloads/index.html
安裝最新版本即可,如果安裝舊版通常要註冊Oracle賬戶。
我裝的是jdk13,裝完之後沒有看到jre文件夾,看網上教程發現還要手動安裝jre:
在jdk的目錄下:
bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
但後來重新安裝一次JDK又有了,迷惑。。。
3.配置環境變量
在path中增加一個bin目錄的環境變量即可
4.hello world
public class Test {
//static表示唯一,main是唯一入口,static是特徵修飾符
public static void main(String[] args) {
System.out.println("hello world"); //ln和沒ln的區別是空行
}
}
把文件命名爲Test.java
然後編譯:javac Test.java -encoding UTF-8
因爲有中文註釋,所以加編譯選項,
然後運行:java Test
注意這裏雖然運行的是.class文件,但不需要寫.class
結果:
5.一個注意點
.java文件裏最多隻能有一個public類,並且該文件的名字必須與該public的類名保持一致,(如果沒有public類的話文件名就隨便)
爲什麼如果有public類,文件名就要和類名一致呢?
網上看到一種比較好的解釋(https://blog.csdn.net/WaitForFree/article/details/51033457):
是爲了加快編譯速度。
比如在文件a.java中有類a,類b,而文件k.java中有類c,a.java想用到類c,就要先編譯類c所在的java文件,但它怎麼知道編譯哪個文件才能得到類c呢,當然可以所有文件都找一遍但這樣是很低效的,所以就規定類c(前提是public類,即可以被其他文件調用)所在的文件名必須和c的類名一致(即c),這樣就方便編譯器找到它從而編譯它。
爲什麼c++沒有這種規定呢?
因爲c++還有鏈接期。
c++是先編譯,不同的文件會生成不同的符號表,如果文件a要導入另一個外部類,就會先在符號表的對應位置填個“?”,然後在鏈接過程再去查找其他文件生成的符號表(直到找到爲止),來填補那個“?”,所以c++會稍微耗時點。