# 狂神說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
*/
```
***
# 標識符和關鍵字
## 關鍵字

## 標識符
>Java 所有的組成部分都需要名字。類名、變量名以及方法名都被稱為**標識符**
1. 標識符都應該以(A-Z or a-z 英文, $, _ ) 為開頭
2. 首字母之後可以是(A-Z or a-z 英文, $, _ 或數字) 的任意組合
3. 不可使用關鍵字為變量名或方法名
4. **大小寫十分敏感**
5. 變量名可以是中文,但不推薦使用
***
# 數據類型
- Java屬於**強類型語言**
- 所有變量必須提前定義
- 安全性高,但速度降低
- 補充 : **弱類型語言**
- 變量無須嚴格定義
* **數據類型** : 基本類型 & 引用類型
* 基本之外全是引用
* 
* 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)**
- 必須初始化
- 只在{ }中產生與運作,離開括號後消失

## 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
* 
* 先 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/)

* CMD : **javadoc -encoding UTF-8 -charset UTF-8 (FileName).java**
* 