本篇為Java基礎(chǔ)語法【上】歉提,包含關(guān)鍵字、標(biāo)識(shí)符区转、注釋苔巨、原碼反碼補(bǔ)碼、常量與變量废离、運(yùn)算符這六部分內(nèi)容侄泽。
關(guān)鍵字
定義:被Java語言賦予了特殊含義的單詞。
特點(diǎn):關(guān)鍵字中所有字母都為小寫蜻韭。
標(biāo)識(shí)符
定義:在程序中自定義的一些名稱悼尾。由26個(gè)英文字母大小寫
,數(shù)組:0-9
肖方,符號(hào):_$
組成闺魏。
定義合法標(biāo)識(shí)符規(guī)則:
- 數(shù)字不可以開頭
- 不可以使用關(guān)鍵字
注意:
- Java中嚴(yán)格區(qū)分大小寫
- 在命名時(shí),為了提高閱讀性俯画,要盡量有意義
-
main
不是關(guān)鍵字析桥,因?yàn)楹瘮?shù)名稱都是標(biāo)識(shí)符,只是JVM識(shí)別main
函數(shù),函數(shù)頭的格式必須固定
注釋
格式:
- 單行注釋
//
- 多行注釋
/* */
- 文檔注釋
/** */
用途:
- 注解說明
- 調(diào)試程序
其中烹骨,單行注釋中可以嵌套單行/多行注釋,多行注釋中可以嵌套單行注釋材泄,但不能嵌套多行注釋沮焕;對(duì)于單行和多行注釋,被注釋的文字拉宗,不會(huì)被編譯到字節(jié)碼(.class
)文件中峦树,因此不會(huì)被JVM解釋執(zhí)行;文檔注釋為Java特有的注釋旦事,其中注釋內(nèi)容可以被JDK提供的工具javadoc.exe
所解析魁巩,生成一套以網(wǎng)頁文件形式體現(xiàn)的該程序的說明文檔。
文檔注釋的一般寫法:
/**
* 用于操作數(shù)組的工具類姐浮,其中包含獲取最值谷遂、排序等功能。
* @author LoisHuang
* @version 2019/7/9
*/
public class ArrayTool
{
/**
* 獲取整型數(shù)組的最大值
* @param arr 接收一個(gè)int類型的數(shù)組
* @return 該數(shù)組的最大的元素值
*/
public static int getMax(int[] arr)
{
...
}
}
注意可以通過javadoc
命令生成說明文檔的類和方法必須是由public
或protected
修飾的卖鲤,故私有的方法不用加文檔注釋肾扰,用多行注釋寫明功能即可。
tips:
- 面試:上機(jī)題蛋逾,寫注釋
- 在看代碼的時(shí)候集晚,可以通過寫注釋來檢驗(yàn)是否看懂(代碼只是思想的一種表現(xiàn)形式)
原碼反碼補(bǔ)碼
(畢向東的Java基礎(chǔ)教程中沒有單獨(dú)講這一節(jié)的內(nèi)容,但我認(rèn)為對(duì)于后面的常量/變量以及運(yùn)算符的理解非常有用区匣。)
注意:原碼和反碼只是為了求負(fù)數(shù)的補(bǔ)碼偷拔,在計(jì)算機(jī)中沒有原碼、反碼的存在亏钩,只有補(bǔ)碼莲绰。
原碼
- 正數(shù)的原碼就是它本身
假設(shè)使用一個(gè)字節(jié)存儲(chǔ)整數(shù),整數(shù)10的原碼是:0000 1010
- 負(fù)數(shù)用最高位是1表示負(fù)數(shù)
假設(shè)使用一個(gè)字節(jié)存儲(chǔ)整數(shù)铸屉,整數(shù)-10的原碼是:1000 1010
反碼
- 正數(shù)的反碼和原碼一樣
假設(shè)使用一個(gè)字節(jié)存儲(chǔ)整數(shù)钉蒲,整數(shù)10的反碼是:0000 1010
- 負(fù)數(shù)的反碼是負(fù)數(shù)的原碼按位取反(0變1,1變0),符號(hào)位不變
假設(shè)使用一個(gè)字節(jié)存儲(chǔ)整數(shù)彻坛,整數(shù)-10的反碼是:1111 0101
補(bǔ)碼
再次強(qiáng)調(diào)顷啼,整數(shù)的補(bǔ)碼才是在計(jì)算機(jī)中的存儲(chǔ)形式。
- 正數(shù)的補(bǔ)碼和原碼一樣
假設(shè)使用一個(gè)字節(jié)存儲(chǔ)整數(shù)昌屉,整數(shù)10的補(bǔ)碼是:0000 1010
(第三次強(qiáng)調(diào):這一串是10這個(gè)整數(shù)在計(jì)算機(jī)中存儲(chǔ)形式) - 負(fù)數(shù)的補(bǔ)碼是負(fù)數(shù)的反碼加1
假設(shè)使用一個(gè)字節(jié)存儲(chǔ)整數(shù)钙蒙,整數(shù)-10的補(bǔ)碼是:1111 0110
(第三次強(qiáng)調(diào):這一串是-10這個(gè)整數(shù)在計(jì)算機(jī)中存儲(chǔ)形式)
在計(jì)算機(jī)中,為什么不用原碼和反碼间驮,而是用補(bǔ)碼呢躬厌?
因?yàn)樵谑褂迷a、反碼計(jì)算時(shí)不準(zhǔn)確,使用補(bǔ)碼計(jì)算時(shí)才準(zhǔn)確扛施。
使用原碼計(jì)算10-10
0000 1010 『枧酢(10的原碼)
+ 1000 1010 (-10的原碼)
------------------------------------------------------------
1001 0100 「碓(結(jié)果為:-20匙奴,很顯然答案是否定的。)使用反碼計(jì)算10-10
0000 1010 ⊥蟆(10的反碼)
+ 1111 0101 ∑镁(-10的反碼)
------------------------------------------------------------
1111 1111 (結(jié)果為反碼啦租,轉(zhuǎn)換成原碼為:1000 0000哗伯,最終的結(jié)果為:-0,很顯然答案是否定的篷角。)使用補(bǔ)碼計(jì)算10-10
0000 1010 『干病(10的補(bǔ)碼)
+ 1111 0110 (-10的補(bǔ)碼)
------------------------------------------------------------
1 0000 0000 ∧诘亍(使用的1個(gè)字節(jié)存儲(chǔ)伴澄,只能存儲(chǔ)8位,第9位的1沒地方存阱缓,就被丟棄了非凌。故結(jié)果為:0。)
常量與變量
常量
概念:表示不能改變的值荆针。
分類:
- 整數(shù)常量:所有整數(shù)
- 小數(shù)常量:所有小數(shù)
- 布爾(
boolean
)型常量:較為特有敞嗡,只有true/false
兩個(gè)數(shù)值。 - 字符常量:將一個(gè)數(shù)字航背、字母或符號(hào)用單引號(hào)
' '
標(biāo)識(shí) - 字符串常量:將一個(gè)或者多個(gè)字符用雙引號(hào)
" "
標(biāo)識(shí) - null常量:只有一個(gè)
null
數(shù)值
在Java中喉悴,整數(shù)有四種表現(xiàn)形式:二/八/十/十六進(jìn)制。因?yàn)槭M(jìn)制非0開頭玖媚,所以其他進(jìn)制的寫法箕肃,要前補(bǔ)0用于區(qū)分。二進(jìn)制:0b
或 0B
開頭今魔;八進(jìn)制:0
開頭勺像;十六進(jìn)制:0x
或0X
開頭;負(fù)數(shù)前面加 -
错森。
變量
概念:內(nèi)存中的一個(gè)存儲(chǔ)區(qū)域吟宦,該區(qū)域有自己的名稱(變量名)和類型(數(shù)據(jù)類型),數(shù)據(jù)可以在同一類型范圍內(nèi)不斷變化涩维。
變量使用的兩個(gè)條件:有初始值和特定作用域殃姓。
數(shù)據(jù)類型:Java是強(qiáng)類型語言,對(duì)于每一種數(shù)據(jù)都定義了明確的具體數(shù)據(jù)類型,在內(nèi)存中會(huì)分配不同大小的內(nèi)存空間蜗侈。
- 整數(shù)類型的存儲(chǔ)空間大小分別為1, 2, 4, 8byte篷牌,最常用的類型是
byte
和int
,默認(rèn)類型為int
踏幻; - 浮點(diǎn)型的存儲(chǔ)空間大小分別為4, 8byte娃磺,默認(rèn)類型為
double
; - 字符型(
char
)的存儲(chǔ)空間大小為2byte叫倍。
注意:由于整數(shù)類型默認(rèn)為int
,因此若一個(gè)大于int
類型范圍的整數(shù)常量賦值給long
類型的變量時(shí)豺瘤,結(jié)尾應(yīng)該加上l
吆倦,同理浮點(diǎn)型常量賦值給float
類型的變量時(shí),結(jié)尾加上f
坐求。
Example1
long a = 1234567891234l;
float b = 2.3f;
類型轉(zhuǎn)換&類型提升
針對(duì)于Java基礎(chǔ)數(shù)據(jù)類型蚕泽。
- 自動(dòng)類型轉(zhuǎn)換(隱式類型轉(zhuǎn)換)
兩種類型是彼此兼容的
-
轉(zhuǎn)換的目的類型占得空間范圍一定要大于轉(zhuǎn)化的源類型
正向過程:由低字節(jié)向高字節(jié)自動(dòng)轉(zhuǎn)換,byte->short->int->long->float->double
桥嗤。
Example1-1short i = 5; int j = i;
Example1-2
byte b = 4; //注意4為int類型(任何整數(shù)都為int)
編譯器會(huì)判斷4是否在byte范圍內(nèi)须妻,如果在,則會(huì)做自動(dòng)強(qiáng)轉(zhuǎn)泛领。
-
強(qiáng)制類型轉(zhuǎn)換(顯示類型轉(zhuǎn)換)
格式:目標(biāo)類型 變量 =(目標(biāo)類型)源類型變量/常量
逆向過程:使用強(qiáng)制轉(zhuǎn)換荒吏,可能丟失精度,如int a=(int)3.14;
渊鞋。
Example2-1int i = 5; byte j = (int)i;
Example2-2
byte b; b = 3; b = (byte)b*3 //編譯出錯(cuò)绰更,因?yàn)?byte)的運(yùn)算級(jí)別比*高,所以會(huì)先轉(zhuǎn)換b后再*3 b = (byte)(b*3) //正確
-
數(shù)據(jù)類型自動(dòng)提升(注意以下討論的是二元操作符)
Java定義了若干使用于表達(dá)式的類型提升規(guī)則:
a. 如果兩個(gè)操作數(shù)其中有一個(gè)是double
類型,另一個(gè)操作就會(huì)轉(zhuǎn)換為double
類型锡宋;
b. 否則儡湾,如果其中一個(gè)操作數(shù)是float
類型,另一個(gè)將會(huì)轉(zhuǎn)換為float
類型执俩;
c. 否則徐钠,如果其中一個(gè)操作數(shù)是long
類型,另一個(gè)會(huì)轉(zhuǎn)換為long
類型役首;
d. 否則尝丐,兩個(gè)操作數(shù)都轉(zhuǎn)換為int
類型。
(例外:final
修飾的byte
宋税、short
摊崭、char
變量相加后不會(huì)被自動(dòng)提升)
Example3-1System.out.println('a'); //輸出字母a System.out.println('a' + 1); //輸出98
char
型自動(dòng)提升為int
型。
Example3-2byte a = 1; byte b = 2; a = a + b; //自動(dòng)類型提升成int,編譯出錯(cuò) a += b; //自加沒有自動(dòng)類型提升問題
把高字節(jié)轉(zhuǎn)成低字節(jié)杰赛,需要作強(qiáng)制類型轉(zhuǎn)換:
a=(byte)(a+b);
Example3-3byte b1 = 1, b2 = 2, b3, b6; final byte b4 = 4,b5 = 6; b6 = b4 + b5; b3 = b1 + b2; //會(huì)發(fā)生編譯錯(cuò)誤 System.out.println(b3 + b6);
沒有
final
修飾的變量相加后會(huì)被自動(dòng)提升為int
型呢簸,與目標(biāo)類型byte
不相容,需要強(qiáng)制轉(zhuǎn)換(向下轉(zhuǎn)型)。
Example3-4int x; int x1 = Integer.MAX_VALUE; int x2 = 2; x = x1 + x2; System.out.println(x); //輸出結(jié)果為-2147483647(其中Integer.MAX_VALUE為2147483647)
默認(rèn)
int
類型根时,運(yùn)算一旦超出范圍瘦赫,會(huì)自動(dòng)舍棄,保留原有位數(shù)蛤迎。
注:Java內(nèi)置Unicode
國際標(biāo)準(zhǔn)碼表确虱,ASCII
為美國標(biāo)準(zhǔn)碼表,GBK
為中國標(biāo)準(zhǔn)碼表替裆,任何國家的碼表都兼容ASCII
碼表校辩。
運(yùn)算符
注意:運(yùn)算符都是有結(jié)果的。
算術(shù)運(yùn)算符
-
+
正號(hào)辆童,-
負(fù)號(hào) -
+
宜咒,-
,*
把鉴,/
故黑,%
,加減乘除取模 -
++
自增(前)庭砍,++
自增(后)场晶,--
自減(前),--
自減(后) -
+
字符串相加怠缸,連接符
Example1:整數(shù)除法運(yùn)算
int x = 6370;
x = x / 1000; //x的結(jié)果為诗轻?
對(duì)于除號(hào)/
,它的整數(shù)除和小數(shù)除是有區(qū)別的:整數(shù)之間做除法時(shí)揭北,只保留整數(shù)部分而舍棄小數(shù)部分概耻。Java為強(qiáng)類型語言,因此x/1000
罐呼,兩個(gè)int
類型運(yùn)算的值仍然為int
類型鞠柄。
Example2:負(fù)數(shù)取模運(yùn)算
System.out.println(-5 % 2); //輸出-1
System.out.println(5 % -2); //輸出1
涉及到負(fù)數(shù)的模運(yùn)算,只參考被模數(shù)(第一個(gè)數(shù))嫉柴。
Example3-1:自增運(yùn)算
int a = 3, b;
b = a++;
實(shí)際上運(yùn)算過程為:由于a本身涉及到與b的運(yùn)算厌杜,因此會(huì)先開辟一個(gè)臨時(shí)變量,存儲(chǔ)a當(dāng)前的值(怕a的值改變)计螺,如temp=3
夯尽;而賦值運(yùn)算需要等右邊的運(yùn)算先計(jì)算完成,于是現(xiàn)在計(jì)算右邊的a++
登馒,計(jì)算完a+1
后賦值給a匙握,于是a=4
;最后再將temp賦值給b陈轿,如下圖所示:
Example3-2:自增運(yùn)算
int i = 3;
i = i++;
System.out.println("i=" + i); //輸出i=3圈纺;
i = i++
實(shí)際運(yùn)算過程可理解為:
temp = i;
i = i + 1;
i = temp;
Example4-1:字符串相加
System.out.println(3 +"2");//輸出32
System.out.println("5+5=" + 5 + 5);//輸出5+5=55
+
除字符串相加功能外秦忿,還能把非字符串轉(zhuǎn)換成字符串。
第一步"5+5=5"+5
蛾娶,第二步"5+5=55"
灯谣;若要輸出10,則可改為System.out.println("5+5="+(5+5));
蛔琅,輸出5+5=10
胎许。
任何數(shù)據(jù)只要和字符串進(jìn)行+
運(yùn)算,都叫做相連接罗售。用處如下:
Example4-2:同時(shí)輸出a與b的值
int a = 4, b = 5;
System.out.println("a=" + a +",b=" + b);
Example5:注意
int a = 3;
a + 1; //編譯錯(cuò)誤:a+1不是語句
System.out.println("a=" + a);
賦值運(yùn)算符
符號(hào): =
辜窑, +
,=
寨躁,-=
谬擦, *=
, /=
朽缎, %=
Example1:+=
簡單示例
int a, b, c;
a = b = c = 4;
a += 2; //將左右兩邊的和賦給左邊
Example2-1
short s = 3;
s = s + 4;//編譯錯(cuò)誤,可能損失精度
System.out.println("s=" + s);
Example2-2
short s = 3;
s += 4;
System.out.println("s=" + s); //輸出s=7谜悟;
s = s + 4
:編譯失敗话肖,其為兩次運(yùn)算,s會(huì)被提升為int型葡幸,運(yùn)算后的結(jié)果還是int型最筒,無法賦值給short型。
s += 4
:編譯通過蔚叨,其是賦值運(yùn)算床蜘,為一次運(yùn)算,與s = 3
類似蔑水;+=
運(yùn)算符在給s賦值時(shí)邢锯,自動(dòng)完成了強(qiáng)轉(zhuǎn)操作,其在內(nèi)存中的形式為s = (short)(s + 4)
搀别。
比較運(yùn)算符
符號(hào):==
丹擎,!=
,<
歇父, >
蒂培,<=
,>=
instanceof
檢查是否是類的對(duì)象榜苫,"Hello" instanceof String
結(jié)果為true
护戳。
注意:比較運(yùn)算符的結(jié)果都是boolean
型。
邏輯運(yùn)算符
定義:用來連接兩個(gè)boolean
類型的表達(dá)式垂睬,結(jié)果為boolean
型媳荒。
面試題 ——&
與&&
的區(qū)別:
&
:左邊無論真假抗悍,右邊都進(jìn)行運(yùn)算。
&&
:若左邊為真肺樟,右邊參與運(yùn)算檐春;若左邊為假,右邊則不參與運(yùn)算么伯。
|
與||
的區(qū)別同理疟暖,||
:左邊為真,右邊不參與運(yùn)算田柔。
位運(yùn)算符
注意在計(jì)算機(jī)系統(tǒng)中俐巴,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。
位運(yùn)算是直接對(duì)二進(jìn)制進(jìn)行運(yùn)算硬爆。特定情況下欣舵,計(jì)算方便,速度快缀磕,支持面廣缘圈;如果用算數(shù)方法,速度慢袜蚕,邏輯復(fù)雜糟把。位運(yùn)算不限于一種語言,它是計(jì)算機(jī)的基本運(yùn)算方法牲剃。
<<
相當(dāng)于乘以2的倍數(shù)遣疯。
應(yīng)用:最有效率的方式算出2乘以8的值,首選位運(yùn)算(左移三位)凿傅。>>
符號(hào)位(最高位)是什么缠犀,就拿什么補(bǔ)空位。
正數(shù)的右移相當(dāng)于除法聪舒,右移n位就除以2的n次方(n表示移動(dòng)位數(shù))辨液,如100>>4
等效100/2^4
負(fù)數(shù)的右移不等于除法,即負(fù)數(shù)右移不能按除以2的n次方計(jì)算箱残。>>>
數(shù)據(jù)右移時(shí)室梅,高位出現(xiàn)的空位,無論原高位是什么疚宇,空位都用0補(bǔ)亡鼠。&
應(yīng)用:取一個(gè)數(shù)中的指定位。
例如:設(shè)X=1010 1110
敷待,取X的低四位间涵,用X & 0000 1111=0000 1110
即可得到。
方法:找一個(gè)數(shù)榜揖,對(duì)應(yīng)X
要取的位勾哩,該數(shù)的對(duì)應(yīng)位為1抗蠢,其余位為零,此數(shù)與X
進(jìn)行“與運(yùn)算”可以得到X中的指定位思劳。-
^
應(yīng)用:
1)與1相異或迅矛,使特定位翻轉(zhuǎn)
方法:找一個(gè)數(shù),對(duì)應(yīng)X
要翻轉(zhuǎn)的位潜叛,該數(shù)的對(duì)應(yīng)為1秽褒,其余位為零,此數(shù)與X
對(duì)應(yīng)位異或即可威兜。
例如:X=1010 1110
销斟,使X
低四位翻轉(zhuǎn),用X^0000 1111=1010 0001
即可得到椒舵。
2)與0相異或蚂踊,保留原值
例如:X^0000 0000 =1010 1110
3)交換兩個(gè)變量的值
int a = 3, b = 5;
a. 借助第三個(gè)變量來實(shí)現(xiàn)//開發(fā)時(shí),使用第三方變量的形式笔宿,因?yàn)殚喿x性強(qiáng) int c; c = a; a = b; b = c;
b. 利用加減法實(shí)現(xiàn)兩個(gè)變量的交換
//這種方式不要用犁钟,因?yàn)槿绻麅蓚€(gè)整數(shù)的數(shù)值過大,會(huì)超出int范圍泼橘,數(shù)據(jù)會(huì)變化 a = a + b; // a = 3 + 5;a = 8; b = a - b; // 3+5-5 = 3;b = 3; a = a - b; // 3+5-3 = 5; a = 5;
c. 用位異或運(yùn)算來實(shí)現(xiàn)涝动,效率最高
原理:一個(gè)數(shù)異或同一個(gè)數(shù)兩次,結(jié)果還是這個(gè)數(shù)(即是一個(gè)數(shù)異或本身等于0且異或運(yùn)算符合交換律)侥加。//面試的時(shí)候用,閱讀性差 a = a ^ b; // a = 3 ^ 5; b = a ^ b; // b = (3 ^ 5) ^ 5; b = 3; a = a ^ b; // a = (3 ^ 5) ^ 3; a = 5;
~
對(duì)一個(gè)二進(jìn)制數(shù)按位取反粪躬,即將0變?yōu)?担败,1變0。
注意計(jì)算機(jī)中數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)镰官,因此負(fù)數(shù)取反過程:先用原碼表示提前,再轉(zhuǎn)化為補(bǔ)碼,補(bǔ)碼取反泳唠,最后轉(zhuǎn)化為原碼狈网,才是負(fù)數(shù)取反的值。
三元運(yùn)算符
格式:(條件表達(dá)式)?表達(dá)式1:表達(dá)式2
如果條件為true笨腥,運(yùn)算后的結(jié)果是表達(dá)式1拓哺;如果條件為false,運(yùn)算后的結(jié)果是表達(dá)式2脖母;
Example1:獲取兩個(gè)整數(shù)中的較大的整數(shù)
int a = 3, b = 4;
int max = a > b ? a : b;
Example2:獲取三個(gè)整數(shù)中的較大的整數(shù)
int o = 3, p = 4, q = 5;
//易讀的寫法
int temp = o > p ? o : p;
int max = temp > q : temp : q;
//閱讀性較差的寫法
int max = (o > p ? o : p) > q : (o > p ? o : p) : q;
【參考文檔】:
1士鸥、Java基礎(chǔ)-原碼反碼補(bǔ)碼
2、java 基本數(shù)據(jù)類型及自動(dòng)類型提升
3谆级、java中的二進(jìn)制以及基本位運(yùn)算
4烤礁、右移運(yùn)算符總結(jié)