1、Java語(yǔ)言特性
1.簡(jiǎn)單性
Java算是C++語(yǔ)法的一個(gè)“純凈”版本了,里沒有頭文件、指針運(yùn)算(甚至指針語(yǔ)法)、結(jié)構(gòu)、聯(lián)合、操作符重載、虛基類等。
2.面向?qū)ο笮裕ǚ庋b,繼承,多態(tài))
簡(jiǎn)單的講,面向?qū)ο笤O(shè)計(jì)是一種程序設(shè)計(jì)技術(shù)。它將重點(diǎn)放在數(shù)據(jù)(即對(duì)象)和對(duì)象的接口上。用木匠打一個(gè)比方:一個(gè)“面向?qū)ο蟆钡哪窘呈冀K首先關(guān)注的是所制作的椅子,其次才是所使用的工具和材料;而一個(gè)“非面向?qū)ο蟆钡哪窘持饕紤]的是所用的工具。
3.分布式
Java有一個(gè)豐富的例程庫(kù),用于處理像HTTP和FTP之類的TCP/IP協(xié)議。Java應(yīng)用程序能夠通過URL打開和訪問網(wǎng)絡(luò)上的對(duì)象,其邊便捷程度就好像訪問本地文件一樣。
4.健壯性(Java語(yǔ)言的強(qiáng)類型機(jī)制、異常處理、垃圾的自動(dòng)收集等)
Java非常強(qiáng)調(diào)進(jìn)行早期的問題檢測(cè)、后期動(dòng)態(tài)的(運(yùn)行時(shí))檢測(cè),以及消除容易出錯(cuò)的情況。Java與C/C++最大的不同在于Java采用的指針模型可以消除重寫內(nèi)存和損壞數(shù)據(jù)的可能性。
5.安全性
Java要適用于網(wǎng)絡(luò)/分布式環(huán)境。為了實(shí)現(xiàn)這個(gè)目標(biāo),安全性頗受重視。使用Java可以構(gòu)建防病毒、防篡改的系統(tǒng)。比如說運(yùn)行時(shí)堆棧溢出,這是蠕蟲和病毒常用的手段;破壞自己的進(jìn)程空間之外的內(nèi)存;未經(jīng)授權(quán)讀寫文件。
6.體系結(jié)構(gòu)中立
編譯器生成一個(gè)體系結(jié)構(gòu)中立的目標(biāo)文件格式,這是一種編譯過的代碼,只要有Java運(yùn)行時(shí)系統(tǒng),這些編譯后的代碼可以在許多處理器上運(yùn)行。Java編譯器通過生成與特定的計(jì)算機(jī)體系結(jié)構(gòu)無關(guān)的字節(jié)碼指令來實(shí)現(xiàn)這一特性。
7.可移植性
與C和C++不同,Java規(guī)范中沒有“依賴具體實(shí)現(xiàn)”的地方?;緮?shù)據(jù)類型的大小以及有關(guān)運(yùn)算的行為都有明確的說明。
8.解釋型
Java解釋器可以在任何移植了解釋器的機(jī)器上直接執(zhí)行Java字節(jié)碼。由于連接是一個(gè)增量式且輕量級(jí)的過程,所以開發(fā)過程也變得更加快捷,更加具有探索性。
9.多線程(多線程機(jī)制使應(yīng)用程序在同一時(shí)間并行執(zhí)行多項(xiàng)任)
Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
2、JVM、JRE和JDK的關(guān)系
JVM:
Java Virtual Machine是Java虛擬機(jī),Java程序需要運(yùn)行在虛擬機(jī)上,不同的平臺(tái)有自己的虛擬機(jī),因此Java語(yǔ)言可以實(shí)現(xiàn)跨平臺(tái)。
JRE:
Java Runtime Environment包括Java虛擬機(jī)和Java程序所需的核心類庫(kù)等。核心類庫(kù)主要是java.lang包:包含了運(yùn)行Java程序必不可少的系統(tǒng)類,如基本數(shù)據(jù)類型、基本數(shù)學(xué)函數(shù)、字符串處理、線程、異常處理類等,系統(tǒng)缺省加載這個(gè)包
如果想要運(yùn)行一個(gè)開發(fā)好的Java程序,計(jì)算機(jī)中只需要安裝JRE即可。
JDK:
Java Development Kit是提供給Java開發(fā)人員使用的,其中包含了Java的開發(fā)工具,也包括了JRE。所以安裝了JDK,就無需再單獨(dú)安裝JRE了。其中的開發(fā)工具:編譯工具(javac.exe),打包工具(jar.exe)等
JVM&JRE&JDK關(guān)系圖
Java基本數(shù)據(jù)類型圖

當(dāng)用一個(gè)二元運(yùn)算符連接兩個(gè)值時(shí),(如a+b,a為整型,b為浮點(diǎn)型),首先會(huì)將兩個(gè)操作數(shù)轉(zhuǎn)換為同一種類型,然后再進(jìn)行計(jì)算:
- 如果a和b中有一個(gè)操作數(shù)是double類型,另一個(gè)數(shù)也會(huì)轉(zhuǎn)換為double類型
- 否則,如果其中一個(gè)數(shù)是float類型,另一個(gè)轉(zhuǎn)換為float類型
- 否則,如果其中一個(gè)數(shù)是long類型,另一個(gè)轉(zhuǎn)換為long類型
- 否則,兩個(gè)數(shù)都會(huì)被轉(zhuǎn)換為int類型
強(qiáng)制類型轉(zhuǎn)換
double x = 9.997;
int nx = (int) x;
其強(qiáng)制類型轉(zhuǎn)換結(jié)果為9
注意:如果試圖將一個(gè)數(shù)值轉(zhuǎn)換為另一種類型,而又超出了目標(biāo)類型的表示范圍,結(jié)果就會(huì)截?cái)酁橐粋€(gè)完全不同的值。
String類型
- String類的substring方法可以從一個(gè)較大的字符串提取出一個(gè)子串:
String a = "hello";
String s = a.substring(0,3);
上述代碼輸出是一個(gè)由"hel"組成的字符串。
- Java語(yǔ)言允許使用+號(hào)拼接兩個(gè)字符串
String a = "deleted" + abc;
檢測(cè)字符串是否相等
- 可以用equals方法檢測(cè)兩個(gè)字符串是否相等:
String s = "hell";
String a = "hell";
s.equals(a)
- 如果想不區(qū)分大小寫檢驗(yàn)兩個(gè)字符串是否相等,可以用equalsIgnoreCase方法:
"Hell".equalsIgnoreCase("hello");
注意?。∫欢ú灰?=運(yùn)算符檢測(cè)兩個(gè)字符串是否相等,這個(gè)字符串只能夠確定兩個(gè)字符串是否放在同一個(gè)位置上。
空串與NULL串
- 空串" "是長(zhǎng)度為0的字符串,可以用if(str.length == 0)檢驗(yàn)一個(gè)字符串是否為空串
- 檢驗(yàn)是否為NULL串可以使用if(str == null)來判斷,如果在一個(gè)null值上調(diào)用方法會(huì)出現(xiàn)錯(cuò)誤
輸入與輸出
輸入:Scaner類定義在java.util包中
Scanner in = new Scanner(System.in);
String name = in.nextLine(); //讀取一行輸入
String nickname = in.next() //讀取一個(gè)單詞,以空白符作為分隔符
int age = in.nextInt(); //讀取一個(gè)整數(shù)
輸出:
System.out.println(); //標(biāo)準(zhǔn)輸出
System.out.print(); //格式化輸出
文件的輸入與輸出
- 想要讀取一個(gè)文件,需要構(gòu)造一個(gè)Scanner對(duì)象:
Scanner in = new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);
不能讀取一個(gè)不存在的文件
- 想要寫入文件,就需要構(gòu)造一個(gè)PrintWriter對(duì)象:
PrintWriter out = new PrintWriter("myfile.txt",StandardCharsets.UTF_8);
如果文件不存在被寫入文件則創(chuàng)建該文件
數(shù)組的打印和排序
- 利用Arrays.toString(a)來打印出數(shù)組a里面的元素
- 利用Arrays.sort(a)對(duì)數(shù)值型數(shù)組a進(jìn)行排序