前面都寫了 9 篇啦,雖然斷斷續(xù)續(xù)發(fā)了半個月列荔,寫著寫著會發(fā)現(xiàn)每篇中都有些比較重要的地方?jīng)]有講到~ 這篇還是需要填一填目前我已發(fā)現(xiàn)的坑了~
一、 小結(jié)
- Java 編譯命令 javac贴浙、運(yùn)行命令 java
- java 默認(rèn)字符編碼為 Unicode
- Java 程序從 main 方法開始
- 每一個語句都需要以英文分號結(jié)束。
- 程序會被 {} 劃分出范圍崎溃。
- 類型與方法都需要定義在 {} 中
- 對于空格通常不影響代碼運(yùn)行
- Java 中的標(biāo)識符就是類名、變量名袁串、方法名、包名赎瑰。
- 關(guān)鍵字、保留字全部都是小寫餐曼,比如 null。
- 變量名可以由字母源譬、數(shù)字、下劃線瓶佳、美元符組成鳞青,但標(biāo)識符不能以數(shù)字開頭,也不能是關(guān)鍵字臂拓,區(qū)分大小寫。
- 變量類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
- byte 的取值范圍是 - 128~127
- 常量定義之后胶惰,不會改變
- 注釋有 //、//孵滞、/ ... */
- 運(yùn)算符涉及到優(yōu)先級,建議加好 ()
- = 號是賦值泄伪,== 號是相等
- 選擇結(jié)構(gòu)的條件必須為布爾表達(dá)式排拷,返回值必須為 true 或者 false
- break 會使程序跳出循環(huán)梅掠,continue 只會跳過該次循環(huán)泽谨。
- System.out.print() 是輸出語句庞溜,System.out.println() 是自帶換行
二孤页、Java 的編譯運(yùn)行
寫好源代碼之后尔苦,我的學(xué)習(xí)記錄里只有寫到怎么用允坚,卻沒有去詳細(xì)解釋流程,如此就造成了一些知其然而不知其所以然的問題屋讶,so须教,這里補(bǔ)充上:
首先,需要給幾個定義:
Java 虛擬機(jī)(JVM):是可以運(yùn)行 Java 代碼的虛擬計算機(jī)轻腺。只要電腦上安裝有 Java 環(huán)境,就擁有 JVM 虛擬機(jī)贬养。
字節(jié)碼(Byte-code):是一種包含執(zhí)行程序,由一序列 op 代碼 / 數(shù)據(jù)對組成的二進(jìn)制文件仰美,是一種中間碼迷殿。(百科)
機(jī)器碼:指的是將硬件序列號經(jīng)過一系列加密庆寺、散列形成的一串序列號。(百科)
1. 編譯
寫好代碼后,保存的為 .java 文件壤圃,用 javac.exe(編譯器)編譯之后,編譯器會先檢查錯誤:
如果有錯伍绳,則編譯無法完成,需要修改墨叛,直至修改到?jīng)]錯了,才能通過漠趁。
如果沒錯,通過編譯闯传,產(chǎn)出一個字節(jié)碼文件(.class)。
so字币,編譯器:將 Java 源文件(.java)編譯成字節(jié)碼文件(.class 文件,是特殊的二進(jìn)制文件洗出,二進(jìn)制字節(jié)碼文件)
字節(jié)碼文件與平臺是無關(guān)的,這也是 JVM 的平臺無關(guān)性的來源图谷。
2. 解釋
編譯完成后,JVM 操作解釋器將產(chǎn)生的字節(jié)碼文件來解釋菠镇。
解釋器解釋字節(jié)碼的過程,就是將字節(jié)碼文件解釋成本機(jī)能夠識別的機(jī)器碼利耍。
機(jī)器碼與平臺是有關(guān)的,不同平臺的機(jī)器碼不同隘梨。
解釋由分成以下步驟:
首先,通過類加載器(class loader)將所有代碼裝入解釋器出嘹。
然后,被裝入的代碼由字節(jié)碼校驗器進(jìn)行檢查税稼,若無錯誤郎仆,則進(jìn)入下一步。
3. 執(zhí)行
Java 字節(jié)碼開始執(zhí)行扰肌,這個也有兩種方式:
a. 即時編譯方式:先將字節(jié)碼編譯成機(jī)器碼熊杨,再執(zhí)行該機(jī)器碼曙旭。
b. 解釋執(zhí)行方式:解釋器通過每次解釋并執(zhí)行一小段代碼來完成 Java 字節(jié)碼程序的所有操作桂躏。
通常情況下回采用解釋執(zhí)行方式,這樣會使字節(jié)碼翻譯成機(jī)器碼有更高的效率剂习。當(dāng)然较沪,對于對運(yùn)行速度要求較高的應(yīng)用程序,還是選擇即時編譯比較好尸曼,可以很好的保證 Java 代碼的可移植性以及高性能。
三控轿、變量的聲明與初始化
在程序運(yùn)行的過程中,內(nèi)存有一部分的空間是變化的解幽,這個空間就叫變量。那么聲明變量就是申請了一個內(nèi)存空間片部。內(nèi)存空間在開辟之時,如果沒有賦值的話档悠,內(nèi)存空間會根據(jù)變量的類型來設(shè)置默認(rèn)值。
如果有賦值的話辖所,就會將值存入內(nèi)存空間,否則就是默認(rèn)值缘回。變量的用處:存放數(shù)據(jù)。
int i; // 聲明變量啦吧。申請了一個內(nèi)存空間,當(dāng)前為int的默認(rèn)值0
i = 1; // 初始化變量授滓。將i賦值為1
四肆糕、引用類型
對于引用類型來說般堆,其默認(rèn)值是 null淮摔,沒有任何指向的內(nèi)存空間绍申。
那么數(shù)組也是引用類型,在聲明的時候如果沒有直接給元素的話极阅,那么其默認(rèn)值為 null。
五仆百、邏輯運(yùn)算符
關(guān)于邏輯運(yùn)算符 &&奔脐、|| 兩者俄周,有一點(diǎn)要十分注意:
這兩個存在一個短路問題峦朗,意思就是前面第一個條件已經(jīng)能夠使表達(dá)式得出結(jié)果了,后面的條件就不用判斷了波势。
比如:1>2&&2>1,那么這個因為 1>2 已經(jīng)為假了尺铣,&& 要求兩個都為真才能返回 True,所以后面的條件就不用計算凛忿,直接出返回結(jié)果。2>1 || 1>2店溢,也是一樣。
20190421 補(bǔ)充 已補(bǔ)
A. 注釋:
1. 注釋不會出現(xiàn)在字節(jié)碼文件中者疤,即 Java 編譯器編譯時會跳過注釋語句。
2. 多行注釋的小技巧:可以當(dāng)成行內(nèi)注釋使用叠赦,不會影響到后面的代碼執(zhí)行
B. 標(biāo)識符
1. 因為 Java 采用的是 Unicode 編碼革砸,Unicode 編碼中也有漢字,所以用中文是可以的册踩,但是不建議使用
C. 變量
1. 不建議一行定義多個變量
2. 浮點(diǎn)型變量的表示
十進(jìn)制:1.109效拭、11.09暂吉、110.9慕的、1109挤渔、110900
科學(xué)計數(shù)法:1109e-3,、1109E-2判导、1109E-1、1109眼刃、1109E2
aEb:a 乘 10 的 b 次方
3. 浮點(diǎn)數(shù)是不精確的,一定不要用于比較擂红!
float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f == d); // 結(jié)果為false
float d1 = 423432423f;
float d2 = d1 + 1;
if (d1 == d2) {
System.out.println("d1==d2");// 輸出結(jié)果為d1==d2
} else {
System.out.println("d1!=d2");
}
如果非要進(jìn)行比較的話,可以使用 java.math 包下的 BigInterger 類以及 BigDecimal 類弟头。
BigInterger 實現(xiàn)了任意精度的整數(shù)運(yùn)算、BigDecimal 實現(xiàn)了任意精度的浮點(diǎn)運(yùn)算
BigDecimal bd2 = BigDecimal.valueOf(0.1);
BigDecimal bd3 = BigDecimal.valueOf(1.0/10.0);
System.out.println(bd2.equals(bd3));
4. char 型變量只能用單引號疹娶,不能用雙引號÷琢可以使 (int) 變量或者 0 + 變量來轉(zhuǎn)成數(shù)字。String 是字符序列(引用類型)
5. boolean 型變量在選擇結(jié)構(gòu)中额港,直接寫:if(變量){} 即可歧焦,不推薦寫成:if(變量 ==true){}
D. 數(shù)據(jù)類型
boolean 的大小:理論上占一位向瓷,實際上單個的 boolean 類型在編譯的時候使用的是 int 類型,占 4 個字節(jié)即 32 位猖任,在數(shù)組中每一個 boolean 在 JVM 中占一個字節(jié)。轉(zhuǎn)自:https://blog.csdn.net/u010642004/article/details/50099913
E. 常量
用 final 定義
2. Java 中整型變量的四種表現(xiàn)形式:
二進(jìn)制整數(shù):0b01111101(要求以 0b 或 0B 開頭)
八進(jìn)制整數(shù):023(要求以 0 開頭)
十進(jìn)制整數(shù):99长搀,-100
十六進(jìn)制證書:0x15(要求以 0x 或 0X 開頭)
int a = 0b1101; //以0b開頭是二進(jìn)制
int b = 0117; //以0開頭是八進(jìn)制
int c = 17;
int d = 0x1f; //以0x開頭是16進(jìn)制
System.out.println("二進(jìn)制:"+a);
System.out.println("八進(jìn)制:"+b);
System.out.println("十進(jìn)制:"+c);
System.out.println("十六進(jìn)制:"+d);
F. 二元運(yùn)算規(guī)則
- 整數(shù)運(yùn)算
- 如果兩個數(shù)有一個為 long盈滴,結(jié)果類型為 long
- 兩個操作數(shù)沒有 long 時轿钠,不管原來是什么類型巢钓,結(jié)果為 int 類型
- 浮點(diǎn)運(yùn)算
- 如果兩個數(shù)有一個為 double症汹,結(jié)果類型為 double
- 只有兩個數(shù)都是 float 的時候,結(jié)果才是 float
- 取余運(yùn)算
- 取余的余數(shù)的正負(fù)取決于左邊的數(shù)
- 關(guān)系運(yùn)算
- ==背镇、!= 是所有(基本 & 引用)數(shù)據(jù)類型都能使用
- >咬展、>=破婆、<、<= 只有數(shù)值類型(整型和浮點(diǎn)型)以及 char 能夠使用胸囱。
6. 字符串連接符 “+”
之前代碼中經(jīng)常出現(xiàn) “System.out.println("xx="+a);”,這樣的輸出語句烹笔,為了提示方便裳扯,所以我會在輸出變量前加上字符串饰豺,然后會有一個加號,這個加好就是字符串連接符冤吨。
在使用 “+” 運(yùn)算符連接字符串和 int 型(或 double 型)數(shù)據(jù)時饶套,“+” 將 int(或 double)型數(shù)據(jù)自動轉(zhuǎn)換成 String 類型:(遇到字符串后,往后一行全是連接,括號里的除外(誰讓括號是老大呢))
System.out.println(3+4);// 7
System.out.println(3+"4");// 3(連接)"4" = 34
System.out.println(3+4+"5");// 3(加法)4(連接)"5" = 75
System.out.println(3+4+3+"4");// 3(加法)4(加法)3(連接) "4" = 104
System.out.println(3+4+4+"3"+3);// 3(加法)4(加法)4 (連接) "3" (連接)3 = 1133
這個能看懂嘛?(????ω????)?
字符串連接符還有一個作用:當(dāng)字符串很長的時候叛复,可以用字符串連接符分成好幾行來寫:
System.out.println("我太長啦"
+ "真的,"
+ "不得不分成好幾行來寫咖耘!");
當(dāng)然撬码,+ 號叫字符串連接符,對于 char 字符型來說呜笑,它還是加法哈:(a 在編碼中為 97)
System.out.println('a');//a
System.out.println(4+'a');//4+97=101
20190422 補(bǔ)充
A. 類型轉(zhuǎn)換
- 自動類型轉(zhuǎn)換
整型常量可以直接賦值給 byte凰慈、 short驼鹅、 char 等類型變量森篷,但是要求不超出其范圍豺型。
- 在進(jìn)行相對變量類型來說較大數(shù)值的計算的時候,要注意自動轉(zhuǎn)換引起的數(shù)據(jù)溢出問題:
int money = 100000000; //1億
int years = 22;
//int類型大約為21億钓辆,wage為22億哼绑,超過了int的范圍
int wage = money*years;
System.out.println("wage="+wage);
//因為是兩個int值相乘,所以結(jié)果仍然為int值抖韩,在轉(zhuǎn)成long之前就已經(jīng)造成了數(shù)據(jù)溢出
long wage1 = money*years;
System.out.println("wage="+wage1);
//先將一個數(shù)變成long,以long型與int型進(jìn)行計算茂浮,結(jié)果自動轉(zhuǎn)為long型
long wage2 = money*((long)years);
System.out.println("wage="+wage2);
輸出結(jié)果:所以建議大家在做運(yùn)算的時候,如果結(jié)果有溢出的可能就將第一個操作數(shù)轉(zhuǎn)型為更大的數(shù)據(jù)類型顽馋。
暫時先補(bǔ)充到這兒~ 以后發(fā)現(xiàn)沒寫到的再進(jìn)行補(bǔ)充說明幌羞。
以上,阿里嘎多属桦,20190420 from ahanwhite。