# 狂神說Java學習筆記 : Java 基礎語法 *** > **即使再小的帆也能遠航** >**本篇學習筆記參考自[狂神說](https://www.bilibili.com/video/BV12J41137hu/)** >###### tags: `狂神說Java` `Java基礎` *** # 注釋 1. 單行注釋 : **//** 2. 多行注釋 : /* code */ 3. JavaDoc (文檔注釋,公司較少用,知道即可) : /** code, @AuthorXXX, @Description */ 無聊的時候可以找 : **[有趣的注解](http://jashliao.eu/wordpress/2019/05/16/%E7%A8%8B%E5%BC%8F%E7%A2%BC-%E6%9C%89%E8%B6%A3-%E8%A8%BB%E8%A7%A3-%E6%94%B6%E9%9B%86/)** ```java /*** * _ooOoo_ * o8888888o * 88" . "88 * (| -_- |) * O\ = /O * ____/`---'\____ * . ' \\| |// `. * / \\||| : |||// \ * / _||||| -:- |||||- \ * | | \\\ - /// | | * | \_| ''\---/'' | | * \ .-\__ `-` ___/-. / * ___`. .' /--.--\ `. . __ * ."" '< `.___\_<|>_/___.' >'"". * | | : `- \`.;`\ _ /`;.`/ - ` : | | * \ \ `-. \_ __\ /__ _/ .-` / / * ======`-.____`-.___\_____/___.-`____.-'====== * `=---=' * * ............................................. * 佛祖保佑 永无BUG */ ``` *** # 標識符和關鍵字 ## 關鍵字 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e0a42448c20a4fad9c97a7eef7c05a5d.png#pic_center) ## 標識符 >Java 所有的組成部分都需要名字。類名、變量名以及方法名都被稱為**標識符** 1. 標識符都應該以(A-Z or a-z 英文, $, _ ) 為開頭 2. 首字母之後可以是(A-Z or a-z 英文, $, _ 或數字) 的任意組合 3. 不可使用關鍵字為變量名或方法名 4. **大小寫十分敏感** 5. 變量名可以是中文,但不推薦使用 *** # 數據類型 - Java屬於**強類型語言** - 所有變量必須提前定義 - 安全性高,但速度降低 - 補充 : **弱類型語言** - 變量無須嚴格定義 * **數據類型** : 基本類型 & 引用類型 * 基本之外全是引用 * ![](https://img-blog.csdnimg.cn/8d230ccb13ac435a9e58829fee4195f2.png#pic_center) * Long data type在定義時,習慣會在數字後面加"**L**",如 : ```java long num4 = 40L; ``` - Float data type在定義時,習慣會在數字後面加"**F**",如 : ```java float num5 = 50.1F; ``` - ***String 不是關鍵字,屬於類*** ## 什麼是字節 - 位(bit),**內部儲存數據最小單位** - 字節(byte),**數據處理最小單位** - 1 byte = 8 bit - 1024B = 1KB - 1024KB = 1M - 1024M = 1G ## 思考 : 電腦32位和64位的區別? - 主要差異 : 內存當中的尋址能力 - 64位的最高支持128G的內存,32位最高支持4GB內存 *** # 數據類型擴展及面試題講解 * 整數拓展 : 進制 * 二進制 **0b** * 十進制 * 八進制 **0** * 十六進制 **0x : 0~9, A~F** * 浮點數拓展 * 精度丟失的問題 * ```java float f = 0.1f; // 0.1 double d = 1.0/10; // 0.1 System.out.println(f == d); //Ans = false float d1 = 2313131313131313f; float d2 = d1 + 1; System.out.println(d1 == d2); //Ans = true ``` * **最好完全避免使用浮點數進行比較 最好完全避免使用浮點數進行比較 最好完全避免使用浮點數進行比較** * 字符拓展 * 所有字符的本質還是數字,可進行類別轉換(int()) * 透過Unicode表進行編碼,如 : 97 = 'a' ;65 = 'A' * Unicode表總共兩個byte, 量值從0-65535,對應早期Excel容量最大為 2^16^ = 65536 * ```java char c1 = 'a'; System.out.println(c1); System.out.println((int)c1); //強制轉換 char c2 = '中'; System.out.println(c2); System.out.println((int)c2); //強制轉換 // 所有字符的本質還是數字 // 編碼 Unicode表: 97 = 'a' 65 = 'A', 2字節, 0-65535, Excel 2^16 = 65536 // U0000 UFFFF char c3 = '\u0061'; // \u1為編譯,0061為十六進制,等於97 System.out.println(c3); // a ``` *** # 類型轉換 - 層級由低到高 : byte, short, char --> int --> long --> float --> double - 小數優先級大於整數,然後才考慮容量 - 不同類型的數據須先進行**類型轉換**才可以進行運算 - **強制轉換** : (類型)變量名, 高-->低 - 自動轉換 : 低-->高 - **注意點 1. 不能對布林值進行轉換 2. 不能把對象類型轉換為不相干的類型 3. 在把高容量轉換為低容量時,強制轉換 4. 轉換的時候可能存在內存溢出,或者精度問題!** - JDK7新特性,數字之間可以用下划線分割 - 常犯錯誤 : 內存溢出 - 運算時,會自動將所有變數轉到**最高層級** - ```java public class Demo05 { public static void main(String[] args) { // 操作比較大容量的時候,注意溢出問題 // JDK7新特性,數字之間可以用下划線分割 int money = 10_0000_0000; System.out.println(money); int years = 20; int total = money*years; System.out.println(total); // -1474836480, 計算的時候溢出了 long total2 = money*years; System.out.println(total2); // -1474836480, money和years計算是默認為int,因此在轉換成Long前就在問題 long total3 = ((long)money)*years; System.out.println(total3); //20000000000 } } *** # 變量, 常量, 作用域 ## 變量 - 可以改變的量 ### 變量作用域 - **類變量(class variable)** - 必須初始化,跟隨類 - 開頭需加 **static** - 使用起來很像**global** - **實例變量(instance variable)** - 屬於類,不一定需要初始化 - 如果不自行初始化,這個類型的默認值為 - 0, 0.0 - 布林值默認為false - 除了基本類型,其餘的默認值都是null - **局部變量(local variable)** - 必須初始化 - 只在{ }中產生與運作,離開括號後消失 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8555b5334bb14df0a4a965849bbd686f.png#pic_left =x300) ## Demo08.java ```java public class Demo08 { //類變量 static static double salary = 2500; //屬性 : 變量 //實例變量 : 從屬於對象,如果不自行初始化,這個類型的默認值為0, 0.0 //布林值默認為false //除了基本類型,其餘的默認值都是null String name; int age; // main方法 public static void main(String[] args) { // 局部變量 : 必須聲明和初始化值 int i = 10; System.out.println(i); // 變量類型 變量名字 = new Demo08(); Demo08 demo08 = new Demo08(); System.out.println(demo08.age); System.out.println(demo08.name); //類變量 static System.out.println(salary); } //其他方法 public void add(){ } } ``` ## 常量 - 初始化後就不會改變的值 - 常量名一般使用**大寫**字符 - 關鍵字 : **final** - ```java static final double PI = 3.14; final static double PI2 = 3.14; ``` ## 命名規範 1. **見名知意** 2. 首字母小寫加駝峰原則 (*e.g.* monthSalary) - 類成員變量、局部變量、方法名 3. 大寫字母&下划線 - 常量 4. 首字母大寫加駝峰原則 (*e.g.* Demo01.java) - 類名 *** # 基本運算符 - 算術運算符 : +, -, *, /, %, ++, - - - 關係運算符 : >, <, >=, <=, ==, !=instance of - 邏輯運算符 : &&, ||, ! - 位運算符 : &, |, ^, ~, >>, <<, >>> (**瞭解!!**) - 條件運算符 : **? :** - 擴展賦值運算符 : +=, -=, *=, /= >VSCode 快捷鍵 : **alt + shift + "向下鍵"** -- 複製當前行到下一行 * 運算時,若變量沒有long類型,則所有型態都會被自動轉成Int操作 *** # 自增自減運算符,初識Math類 * a++ 與 ++a的差異在於賦值的時機 * ```java // ++ -- 自增 自減 => 一元運算符 int a = 3; int b = a++; //先賦值在自增 // a++ a = a + 1; System.out.println(a); //4 // ++a a = a + 1; int c = ++a; //先自增在賦值 System.out.println(a); //5 System.out.println(b); //3 System.out.println(c); //5 // Question int Q = a++ + ++b; System.out.println(Q); // 9 ``` ## Math類 ```java // 冪運算 2^3,但java不存在"^"運算 // 很多運算,我們會使用一些工具類來操作! double pow = Math.pow(3, 2); System.out.println(pow); //9.0 ``` *** # 邏輯運算符、位運算符 ## 短路運算 ```java //短路運算 int c = 5; boolean d = (c < 4) && (c++ < 4); System.out.println(d); // false System.out.println(c); // 還是5, 因為d賦值時,邏輯短路,不會經過後面的c++ ``` ## 位運算符 ### 如何運作 * A = 0011 1100 * B = 0000 1101 --- * A&B = 0000 1100 * A|B = 0011 1101 * A^B = 0011 0001 (異或 : 相同為0,不同為1) * ~B = 1111 0010 ### 面試題 & KEY POINT 2 * 8 = 16 怎樣算最快? *Ans* : System.out.println(2<<3); Explanation 0000 0001 1 0000 0010 2 0000 0011 3 0000 0100 4 0000 1000 8 0001 0000 16 **KEY POINT:** "<<" = *2 ">>" = /2 運算效率極高!! *** # 三元運算符以及小節 - 字符串聯接符 "+" - 面試題,以下兩種程式碼差異 - ```java int a = 10; int b = 20; //字符串連接符 + ,String // 字符串(String)在前,後面全部轉為String System.out.println(""+a+b); // 1020 // 字符串(String)在後,前面照常運算 System.out.println(a+b+""); // 30 ``` - 三元運算符 - 格式 : **x ? y : z** - if x == true, then y, otherwise z - **必須掌握的運算符** - ```java int score = 50; String type = (score < 60) ? "Fail" : "Pass" ; //必須掌握 System.out.println(type); ``` *** # 包機制 * 包的本質為文件夾 * **一般利用公司域名倒置為包名**, e.g. www.google.com -> com.google.www * ![在这里插入图片描述](https://img-blog.csdnimg.cn/2d0e23321de443dd8d8c22184560ac7c.png#pic_left) * 先 package XX, 後 import XX * import base.*; * 導入這個包下所有的類 # 補充資料(日後需讀) * [阿里巴巴開發手冊](https://www.haicheng.website/download/book/Java开发手册(嵩山版).pdf) *** # JavaDoc [Java 8 API](https://docs.oracle.com/javase/8/docs/api/) ![在这里插入图片描述](https://img-blog.csdnimg.cn/42cb9b5bcac0421f9d8dc3321f905d81.png#pic_left) * CMD : **javadoc -encoding UTF-8 -charset UTF-8 (FileName).java** * ![在这里插入图片描述](https://img-blog.csdnimg.cn/e3606d4ae3f447feb9e9ca3a2133270e.png#pic_center)