@TOC(Java語言描述、變量和運算符)
一、JAVA語言描述
1.1 java語言描述
-
JDK、JRE、jVM
三者之間的關系,以及JDK、JRE
包含的主要結構有哪些?JDK=Jre +java的開發工具(javac.exe java.exe javadoc.exe)
jre = jvm+java的核心類庫
-
為什么要配置path環境變量?如何配置?
- 希望在任何目錄下都可以執行java命令
cmd
命令輸入sysdm.cpl
在path中配置JAVA_HOME:存儲bin的上一層目錄
PATH = %JAVA_HOME%\bin
-
常用的幾個命令行操作有哪些
cd md rd del cd .. cd /
-
java語言結構示意圖
應用程序=算法 + 數據結構 -
java語言特點
-
面向對象性:
兩個要素
:類、對象三個特征
:封裝、繼承、多態
-
健壯性 :
- 去除了c語言中的指針
- 自動的垃圾回收機制(仍然會出現內存溢出、內存泄漏)
-
跨平臺性
write once, run anywhere
: 一次編譯,到處運行
功勞歸功于:JVM
-
-
編譯過程
-
注釋方式
-
java的三種注釋方式
- 單行注釋
- 多行注釋
- 文檔注釋(java特有)
-
單行注釋和多行注釋的作用
- 對所寫的程序進行解釋說明,增強可讀性。方便自己,方便別人。
- 調試所寫的代碼
-
特點
- 單行注釋和多行注釋,注釋了的內容不參與編譯。換幾句話說,編譯以后生成的.class結尾的字節碼文件中不包含注釋掉的信息。
-
文檔注釋的使用
- 注釋內容可以被JDK提供的工具javadoc所解析,生成一套以網頁文件形式體現的該程序的說明文檔。
-
多行注釋不可以嵌套使用
-
二、變量和運算符
1.1 關鍵字與保留字
- 關鍵字(keyword)的定義與特點
- 定義:被java語言賦予了特殊含義,用做專門用途的字符串(單詞)
- 特點:關鍵字中所有字母都為小寫
- 官方地址:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
用于定義數據類型的關鍵字 | ||||
---|---|---|---|---|
class | interface | enum | byte | short |
int | long | float | double | char |
boolean | void | |||
用于定義流程控制的關鍵字 | ||||
if | else | switch | case | default |
while | do | for | break | continue |
return | ||||
用于定義訪問權限修飾符的關鍵字 | ||||
private | protected | public | ||
用于定義類、函數、變量修飾符的關鍵字 | ||||
abstract | final | static | synchronized | |
用于定義類與類之間關系的關鍵字 | ||||
extends | implements | static | ||
用于定義建立實例及引用實例,判斷實例的關鍵字 | ||||
new | this | super | instanceof | |
用于異常處理的關鍵字 | ||||
try | catch | finally | throw | throws |
用于包的關鍵字 | ||||
package | import | |||
其他修飾符的關鍵字 | ||||
native | strictfp | transient | volatile | assert |
用于定義數據類型值的字面值 | ||||
true | false | null |
true、false、null 嚴格意義上并不算是關鍵字、但是定義變量上還要避免使用它
- Java保留字:現有Java版本尚未使用,但以后版本可能會作為關鍵字使用。自己命名標識符時要避免使用這些
保留字 goto、const
。
1.2 標識符(Identifier)
- 標識符:
- Java對各種變量、方法和類等要素命名時使用的字符序列稱為標識符。
- 技巧: 凡是自己可以起名字的地方都叫標識符
- 定義合法標識符規則:
由26個英文字母大小寫,0-9,_或$組成
。數字不可以開頭
。不可以使用關鍵字和保留字,但能包含關鍵字和保留字
。Java中嚴格區分大小寫,長度無限制
。標識符不能包含空格
**不遵守規則編譯不通過**
1.3 Java中的名稱命名規范(建議)
包名:多單詞組成時所有字母都小寫:xxxyyyzzz
類名、接口名:多單詞組成時,所有單詞的首字母大寫:XxxYyyZzz
變量名、方法名:多單詞組成時,第一個單詞首字母小寫,第二個單詞開發每個單詞首字母大寫:xxxYyyZzz
常量名:所有字母都大寫。多單詞時每個單詞用下劃線連接:XXX_YYY_ZZZ
注意1:在起名字時,為了提高閱讀性,要盡量有意義,“見名知意”。
2.1 變量
- 變量的概念:
- 內存中的一個存儲區域
- 該區域的數據可以在同一類型范圍內不斷變化
- 變量是程序中最基本的存儲單元。包含
變量類型、變量名和存儲的值
。
- 變量的作用:
- 用于在內存中保存數據
- 使用變量注意
- Java中每個變量必須先聲明,后使用
- 使用變量名來訪問這塊區域的數據
- 變量的作用域:其定義所在的一對{}內
- 變量只有在其作用域內才有效
- 同一個作用域內,不能定義重名的變量
- 變量的分類
- 定義:對于每一種數據都定義了明確的具體數據類型(強類型語言),在內存中分配了不同大小的內存空間。
補充:變量的分類-按聲明的位置的不同
- 在方法體外,類體內聲明的變量稱為
成員變量
- 在方法體內部聲明的變量稱為
局部變量
。
- 注意:二者在初始化值方面的異同
- 同:都有生命期 異:局部變量除形參外,需顯示初始化。
2.2 變量整數類型
- 整數類型: byte、short、int、long
- Java各整數類型有固定的表數范圍和字段長度,不受具體OS的影響,以保證java程序的可移植性。
- java的整型變量默認為int型,聲明long型常量須后加‘I’或‘L’
- java程序中變量通常聲明為int型,除非不足以表示較大的數,才使用long
類型 | 占用存儲空間 | 表數范圍 |
---|---|---|
byte | 1字節=8bit位 | -128~127 |
short | 2字節 | -2^15 ~ 2^15-1 |
int | 4字節 | -2^31 ~ 2^31-1(約21億) |
long | 8字節 | -2^63 ~ 2^63-1 |
500MB 1MB = 1024KB 1KB=1024B B=byte bit
bit:計算機中的最小存儲單位。 byte:計算機中基本存儲單位。
- 變量在類中聲明的位置
/**
* 成員變量vs局部變量
*/
class VariableTest1 {public static void main(String[] args) {//1.byte范圍 -128~127byte b1= 12;byte b2 = -128;//b2= 128;//編譯失敗 從int轉換到byte可能會有損失System.out.println(b1);System.out.println(b2);}
}
2.3 浮點類型:float、double
- 與整數類型類似,Java浮點類型也有固定的表數范圍和字段長度,不受具體操作系統的影響。
- 浮點型常量有兩種表示形式:
- 十進制數形式:如:5.12 512.0f .512(必須有小數點)
- 科學計數法形式:如5.12e2 512E2 100E-2
- float:單精度,
尾數可以精確到7位有效數字
。很多情況下,精度很難滿足需求。 - double: 雙精度,精度是float的兩倍。通常采用此類型。
- Java的浮點型常量默認為double型,聲明float型常量,須后加‘f’或‘F’。
類型 | 占用存儲空間 | 表數范圍 |
---|---|---|
單精度float | 4字節 | -3.403E38~3.403E38 |
雙精度double | 8字節 | -1.798E308~1.798E308 |
//2.聲明long型變量,必須以"l"或"L"結尾//3.通常,定義整型變量時,使用int型。short s1 =128;int i1 = 1234;long l1 = 3114234324L;System.out.println(l1);//2. 浮點型:float(4字節) \double(8字節)//1) 浮點型,表示帶小數點的數值//2) float表示數值的范圍比long還大double d1 = 123.3;System.out.println(d1 + 1);//3. 定義float類型變量時,變量要以"f"或"F"結尾float f1 = 123.4F;System.out.println(f1);
注意:通常,定義浮點型變量時,默認使用double型。
2.4 字符類型:char
-
char型數據用來表示通常意義上
“字符”(2字節)
-
java中的所有字符都是用
Unicode
編碼,故一個字符可以存儲一個字母,一個漢字,或其他書面語的一個字符。 -
字符型變量的三種表現形式
- 字符常量是用單引號(‘’)括起來的單個字符。例如:char c1 = ‘a’; char c2 = ‘中’;char c3 = ‘9’;
- Java中還允許使用轉義字符’'來將其后的字符轉變為特殊字符型常量。例如:char c3= ‘\n’; //‘\n’ 表示換行符
- 直接使用
Unicode
值表示字符型常量:‘\uXXXX’。其中,XXXX代表一個十六進制整數。如:\u000a表示\n。 - char類型是可以進行運算的。因為它都對應有
Unicode
碼。
轉義字符 | 說明 |
---|---|
\b | 退格符 |
\n | 換行符 |
\r | 回車符 |
\t | 制表符 |
\" | 雙引號 |
\’ | 單引號 |
\\ | 反斜線 |
//char c1= 'a';//c1 = 'AB';//編譯失敗 錯誤: 未結束的字符文字System.out.println(c1);char c2 = '1';char c3 = '中';char c4 = '@';System.out.println(c2);System.out.println(c3);System.out.println(c4);char c5 = '\n';System.out.println(c5);char c6 = '\t';System.out.println(c6);char c7 = '\u0043';System.out.println(c7);
2.5 了解ASCII碼
-
在計算機內部,所有數據都使用
二進制
表示。每一個二進制位(bit)有0和1兩種狀態,因此8個二進制位就可以組合出256種狀態,這就稱為一個字節(byte)。一個字節一共可以用來表示256
種不同的狀態,每一個狀態一應一個符號,就是256個符號,從0000000到1111111。 -
ASCII碼:上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統一規定。這被稱為ASCII碼。ASCII碼一共規定了128個字符的編碼,比如空格“SPACE”是32(二進制00100000),大寫的字母A是65(二進制01000001)。這
128
個符號(包括32個不能打印出來的控制符號),只占用了一個字節的后面7位,最前面的1位統一規定為0。 -
缺點
- 不能表示所有字符。
- 相同的編碼表示的字符不一樣:比如 130在法語編碼中代表了ě,在希伯來語編碼中卻代表了字母Gimel(λ)
2.6 Unicode編碼
- 亂碼:世界上存在著多種編碼方式,同一個二進制數字可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯誤方式解讀,就會出現亂碼。
- Unicode:一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,使用Unicode沒有亂碼的問題。
- Unicode的缺點:Unicode只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲:無法區別Unicode和ASCII;計算機無法區分三個字節表示一個符號還是分別表示三個符號。另外,我們知道,英文字母只用一個字節表示就夠了,如果unicode統一規定,每個符號用三個或四個字節表示,那么每個英文字母前都必然有二到三個字節是0,這對于存儲空間來說是極大地浪費。
2.7 UTF-8
-
UTF-8是在互聯網上使用最廣的一種Unicode的實現方式。
-
UTF-8是一種變長的編碼方式。它可以使用1-6個字節表示一個符號,根據不同的符號而變化字節長度。
-
UTF-8的編碼規則:
- 對于單字節的UTF-8編碼,該字節的最高位為0,其余7位用來對字符進行編碼(等同于ASCII碼)。
- 對于多字節的UTF-8編碼,如果編碼包含n個字節,那么第一個字節的前n位為1,第一個字節的第n+1位為0,該字節剩余各位用來對字符進行編碼。在第一個字節之后的所有的字節,都是最高兩位為“10”,其余6位用來對字符進行編碼。
2.8 boolean布爾型
//布爾型//1、只能取兩個值之一:true false//2、常常在條件判斷、循環結構中使用boolean bb1 = true;System.out.println(bb1);boolean isMarried = true;if (isMarried) {System.out.println("你就不能參加\"單身\"party了!\\n很遺憾");} else {System.out.println("你可以多談談女朋友!");}
2.9 類型裝換
2.9.1 自動類型提升
byte b1 = 2;int i1 = 129;//byte b2 = b1 + i1; //編譯不通過 錯誤: 不兼容的類型: 從int轉換到byte可能會有損失int i2 = b1 + i1;long l1 = b1 + i1;System.out.println(i2);//131float f= b1 + i1;//float的精度大于long 131.0System.out.println(f); //131.0
結論:當容量小的數據類型的變量與容量大的數據類型的變量做運算時,結果自動提升為容量大的數據類型。
byte、char、short --> int --> long --> float --> double
特別的:當byte、char、short三種類型的變量做運算時,結果為int型。(原因可能他們之間做運算可能會超過其精度)
2.9.2 強制類型轉換
- 需要使用強轉符:()
- 注意點:強制類型轉換,可能導致精度損失
double d1 = 12.9;int i1 = (int)d1;//截斷操作System.out.println(i1);//沒有精度損失long l1 = 123;short s2 = (short)l1;//精度損失舉例2int i2 = 128;//1000 0000byte b = (byte)i2;System.out.println(b); //-128 (1000 0000 byte字節-128的補碼)
2.10 字符串類型
- String不是基本數據類型,屬于引用數據類型
- 使用方式與基本數據類型一致。例如:String str = “abcd”;
- 一個字符串可以串接另一個字符串,也可以直接串接其他類型的數據。例如:str = str + “xyz”; int n =100; str = str + n;
- 基本數據類型與String之間的轉換
char c = 'a'; //a 97int num =10;String str= "hello";System.out.println(c + num + str);//107helloSystem.out.println(c + str + num);//ahello10System.out.println(c + (num + str));//a10helloSystem.out.println((c + num) + str);//107helloSystem.out.println(str + num + c);//hello10a
2.11 關于進制
-
所有數字在計算機底層都以
二進制
形式存在 -
對于整數,有四種表示方式
- 二進制(binary):0,1 滿2進1,以0b或0B開頭。
- 十進制(decimal):0-9 滿10進1。
- 八進制(octal): 0-7 滿8進1 以數字0開頭表示。
- 十六進制(hex):0-9及A-F,滿16進1。以0x或0X開頭表示。此處的A-F不區分大小寫。 如:0x21AF+1=0X21B0
-
進制圖表
十進制 | 十六進制 | 八進制 | 二進制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 2 | 2 | 10 |
3 | 3 | 3 | 11 |
4 | 4 | 4 | 100 |
5 | 5 | 5 | 101 |
6 | 6 | 6 | 110 |
7 | 7 | 7 | 111 |
8 | 8 | 10 | 1000 |
9 | 9 | 11 | 1001 |
10 | A | 12 | 1010 |
11 | B | 13 | 1011 |
12 | C | 14 | 1100 |
13 | D | 15 | 1101 |
14 | E | 16 | 1110 |
15 | F | 17 | 1111 |
16 | 10 | 20 | 10000 |
17 | 11 | 21 | 10001 |
-
進制運算
-
變量之進制
-
Java整數常量默認是int類型,當用二進制定義整數時,其第32位是符號位;當是long類型時,二進制默認為占64位,第64位是符號位。
-
二進制的整數有如下三種形式:
- 原碼:直接將一個數值換成二進制數。最高位是符號位
- 負數的反碼:是對原碼按位取反,只是最高位(符號位)確定為1
- 負數的補碼:其反碼加1.
-
計算機以二進制補碼的形式保存所有的整數
- 正數的原碼、反碼、補碼都相同
- 負數的補碼是其反碼+1
-
3.1 運算符
-
運算符是一種特殊的符號,用以表示數據的運算、賦值和比較等。
- 算數運算符
- 賦值運算符
- 比較運算符(關系運算符)
- 邏輯運算符
- 位運算符
- 三元運算符
3.1.1 運算符:算數運算符
運算符 | 運算 | 范例 | 結果 |
---|---|---|---|
+ | 正號 | +3 | 3 |
- | 負號 | b=4;-b | -4 |
+ | 加 | 5+5 | 10 |
- | 減 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模(取余) | 7%5 | 2 |
++ | 自增(前);先運算后取值 | a=2;b=++a; | a=3;b=3 |
++ | 自增(后);先取值后運算 | a=2;b=a++; | a=3;b=2 |
– | 自減(前);先運算后取值 | a=2;b=–a; | a=1;b=1 |
– | 自減(后);先取值后運算 | a=2;b=a–; | a=1;b=2 |
+ | 字符串連接 | “He” + “llo” | “Hello” |
- 注意點
short s1 = 10;
//s1 = s1 + 1;編譯失敗 (自動向上轉型為int)
s1 = (short)(s1+1);//正確的
s1++;//自增1不會改變本身變量的數據類型byte bb1 = 127;
bb1++;
System.out.println("bb1= " + bb1);//127 二進制對應為01111111 增加1 為10000000 最高位為符號位所以 該二進制為-128
3.1.2 運算符:賦值運算符
-
符號:=
- 當“=”兩側數據類型不一致時,可以使用自動類型轉換或使用強制類型轉換原則進行處理。
- 支持連續賦值。
-
擴展賦值運算符: +=,-=, *=,/=, %=
int i2, j2;
i2 = j2 = 10;
int i3 = 10, j3 = 10;
//思考1:short s =3;//s = s+2;//編譯失敗s +=2;//不會進行類型的變化
//思考2int i =1;i*=0.1;System.out.println("i = " + i);//因為1*=0.1 沒有進行自動類型提升所以 i取整為0i++;System.out.println("i = " + i);//結果
// i = 0
// i = 1
//思考3int m = 2;int n =3;n*=m++;System.out.println("m = " + m);//3System.out.println("n = " + n);//6//結果
// m = 3
// n = 6//思考4:int n =10;n += (n++) + (++n);// n = n + (n++) + (++n) ===> n = 10 + 10 + 12System.out.println("n = " + n);//32
3.1.3 運算符:比較運算符
運算符 | 運算 | 范例 | 結果 |
---|---|---|---|
== | 相等于 | 4 == 3 | false |
!= | 不等于 | 4 != 3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
instancof | 檢查是否是類的對象 | “Hello" instanceof String | true |
- 比較運算符的結果都是boolean型,也就是要么是true,要么是false。
比較運算符“==” 不能語寫成“=”
int i = 10;
int j = 20;
System.out.println(i == j);//false
System.out.println(i = j);//20
3.1.4 運算符:邏輯運算符
- &——邏輯與 |——邏輯或 !—— 邏輯非
- &&——短語與 ||——短路或 ^——邏輯異或
a | b | a&b | a&&b | a|b | a||b | !a | a^b |
---|---|---|---|---|---|---|---|
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | true | true | true |
false | false | false | false | false | false | true | false |
- 練習題
//題目一int x =1;int y = 1;if (x++==2 & ++y ==2) {x = 7;}System.out.println("x = " + x + ",y="+ y);//x = 2,y=2
//題目二int x =1, y = 1;if (x++==2 && ++y ==2) {x = 7;}System.out.println("x = " + x + ",y="+ y);//x=2,y=1//題目三int x =1;int y = 1;if (x++==1 | ++y ==1) {x = 7;}System.out.println("x = " + x + ",y="+ y);//x=7 y=2
//題目四int x =1, y = 1;if (x++==1 || ++y ==1) {x = 7;}System.out.println("x = " + x + ",y="+ y);//x=7,y=1
boolean x = true;boolean y = false;short z = 42;//if (y==true)if ((z++==42) && (y=true))z++; //42 43 44if ((x=false)||(++z==45))z++;//46System.out.println("z = " + z);//46}
3.1.5 運算符:位運算符
與運算 有0則0 或運算 有1 則1
/*** 結論:* 1、位運算符操作的都是整形的數據。* 2、 <<:在一定范圍內,每向左移動一位,相當于 *2* >>:在一定范圍內,每向右移動一位,相當于 /2*/
public class OperatorTest {public static void main(String[] args) {int i = 21;System.out.println("i << 1 : " + (i << 1));//42System.out.println("i << 1 : " + (i << 2));//84System.out.println("i << 27 : " + (i << 27));//-1476395008int j = -21;System.out.println("j << 1 : " + (j << 1));//-42System.out.println("j << 2 : " + (j << 2));//-84//面試題:最高效方式的計算 2 * 8?// 2 << 3 或者 8 << 2}
}
3.1.6 運算符:三元運算符
-
格式:
- (條件表達式)?表達式1:表達式2;
- 為true,運算后的結果是表達式1;
- 為false,運算后的結果是表達式2;
- 表達式1和表達式2為同種類型
-
三元運算符與if-else的聯系與區別:
- 1)三元運算符可簡化if-else語句
- 2)三元運算符要求必須返回一個結果。
- 3)if后的代碼塊可有多個語句
-
三元運算符的使用
/*** 運算符之六:三元運算符* 1、結構:(條件表達式) ? 表達式一 : 表達式二。* 2、說明:* (1)條件表達式的結果為boolean類型。* (2)根據條件表達式真或假,決定執行表達式1,還是表達式2。* 如果表達式結果為true,則執行表達式1。* 如果表達式結果為false,則執行表達式2。* (3)表達式1和表達式2要求是一致的。* (4)三元運算符可以嵌套使用。** 3、凡是可以使用三元運算符的地方,都可以改寫為if-else。* 反之,不成立。** 4、如果程序既可以使用三元運算符,又可以使用if-else結構,那么優先選擇三元運算符。原因:簡潔、執行效率高。**/
public class OperatorTest {public static void main(String[] args) {//獲取兩個整數的較大值int a = 1;int b = 2;int max = (a > b) ? a : b;System.out.println("a: " + a);System.out.println("b: " + b);System.out.println("較大值為: " + max);// (a > b) ? 1 : "hello"; 編譯不通過String maxStr = (a > b) ? "a大" : ((a == b) ? "a和b相等" : "b大");System.out.println(maxStr);//獲取三個數的較大值int i = 1;int j = 2;int k = 3;int temp = (i > j) ? i : j;temp = (temp > k) ? temp : k;System.out.println("最大的數為:" + temp);}
}
3.1.7 運算符:運算符優先級
- 運算符有不同的優先級,所謂優先級就是表達式運算中的運算順序。如上表,上一行運算符總優先于下一行。
- 只有單目運算符、三元運算符、賦值運算符是從右向左運算的。