---
# System prepended metadata

title: '[Java] 初學用的一些筆記'
tags: [Java]

---

# [Java] 初學用的一些筆記
###### tags: `Java`
[TOC]

## :triangular_flag_on_post:特色
- 跨平台(cross-platform) *"write once run anywhere"*
- 物件導向(object-oriented)程式語⾔，不使⽤指標功能
- ⽀援泛型(generics)設計
- ⽀援並⾏(concurrent)處理

## :triangular_flag_on_post:版本
- Java SE (Standard Edition)
    標準版，開發個⼈電腦應⽤程式 (client-side application)
- Java EE (Enterprise Edition)
    企業版，開發伺服端應⽤程式 (server-side application)
- Java ME (Micro Edition)
    微型版，開發嵌入式應⽤程式 (embedded application)

## :triangular_flag_on_post:編譯(complie)
    Java原始程式(.java)經過編譯後產生中介文件Java bytecode(.class)，並交予JVM解譯產生結果
    *不同平台的JVM，會轉譯Java bytecode(.class)為適合該平台的機械碼後執行

- **JDK (Java Development Kit)**
    - 包含Java編譯器、JVM與JavaAPI
    - Java的開發工具，適用於開發人員
- **JRE (Java Runtime Environment)**
    - 包含JVM `(.../jre/bin/lib)` 與JavaAPI `API (.../jre/bin/server)`
    - Java的執行環境，適用於一般使用者執行

### JDK編譯與執行指令
- 編譯Java檔案 `javac FileName.java`
- 執⾏class檔案 `java FileName`
- 查詢版本 `javac -version` `java -version`

## :triangular_flag_on_post: 原始程式（.java）由三部分組成（P.I.C）
- **package(套件)**
```java
//方式1
package packageName;
//方式2
package packageName1.packageName2.packageName3…;
```

- **import(引入、匯入)**
    java.lang會自動匯入
```java
import java.util.java;  //可匯入單個類別
import java.util.*;     //可匯入整個套件,此方法只能省掉最後一段
```

- **class(類別)**
    一個class裡只能有一個公用類別(public class)，但類別(classes)可以有多個
```java
public class ClassName { }
public static void main(String[] args) { }
//宣告(可與static互換位置) 存取權限 表示執行完該函數會傳回值(可略) 主函數 參數 引數
```

## :triangular_flag_on_post: 命名規則
    - Java區分大小寫

+ **關鍵字(keyword)**：Java定義的名稱
    - 全部小寫，如: `package` `import` `if` `for` `else`
+ **識別字(identifier)**：可自定義的名稱，如變數、函數、類別、標籤
    - 由大小寫字母、數字、`_`、`$`..等組成
    - 字首不可用數字
    - 建議駝峰式命名(camel case)
    - 不可使用關鍵字或有特殊意義的符號
    
    1. **類別(class)、介面(interface)**\*此為一種特殊類別
        字首大寫，其餘小寫。如: `String` `StringBuffer`
    3. **屬性：變數(variable)、函數(method)**
        字首小寫，其餘小寫。如: `length` `charAt`
    3. **常數(constant)**
        全大寫，若為複合字可用底線斷句。如: `PI` `MATH` `MAX_VALUE`

## :triangular_flag_on_post: 宣告、指派
    - 透過資料型態宣告變數會占用的空間大小,並指派值給該變數
```java=
//資料型態(datatype) 變數(var) = 值;
int n = 5;
//類別(class) 物件(object) = 值;
String str = "ABC";
```

## :triangular_flag_on_post: 變數（variable）
    - 不可重複宣告。
    - 每個變數都有各自的名稱，並屬於**某一種**資料型態。

-  **成員變數(Member Variables)**
    1. **實例變數(Instance Variables)**
    2. **類別變數(Class Variables)**，又稱靜態變數
        跟隨著類別(Class)，不依附在物件上 ex:`Math`、`System`
        同個類別(Class)的物件可以共享
        有預設初始值 

        | 基本資料型態 | 預設初始值 |
        | -- | :--: |
        | byte | 0 |
        | short | 0 |
        | int | 0 |
        | long | 0L |
        | float | 0.0F |
        | double | 0.0D |
        | char | ’\u0000’ |
        | boolean | false |
        | reference | nullText |

- **區域變數(Local Variables)**
    又稱自動變數，必須定義初始值才可使用、運算
    只在定義它的區域內有效

## :triangular_flag_on_post: 常數（constant）
    - 儲存的值⼀旦指定便不可更改
    - 資料大小是固定的
```java
final datatype var = 15    //如:final int NUM=15
```

## :triangular_flag_on_post: 函數/方法（method）
    - 函數三部曲：宣告>定義>呼叫
- 傳回值
    - 若不須/沒有傳回值——> `void`
    - 若需要/有傳回值———>必須說明傳回值的型態(相容或相同的型態都行)
    ```java
    public datatype className ( datatype var ) { return; }
    //例如
    public double cat ( int x ) { return; }
    //也可傳回整個物件
    public Cat run() { }
    //也可傳回整個陣列
    public Cat[] run() { }
    ```
- Math.pow(數值,平方)
    ```java
    Math.pow(4,2) //結果16
    ```
- Math.sqrt(數值平方後的值)
    ```java
    Math.sqrt(16) //結果4
    ```

## :triangular_flag_on_post: 資料型態
    目的是能給予資料正確的記憶體與進行運算

- **基本資料型態**，共八種
    | 型態 | 儲存空間 | 值域範圍 | 說明 |
    | -- | --: | :--: | -- |
    | **int** | 4 bytes | -2147483648(-2^31^) \~ 214483647(2^31^-1) | `整數型態` `整數常數` |
    | long | 8 bytes | -2^63^ \~ 2^63^-1 | `整數型態` `整數常數` 字尾需加L |
    | short | 2 bytes | -32768(-2^15^) \~ 32767(2^15^-1) | `整數型態` |
    | byte | 1 byte | -128(-2^7^) \~ 127(2^7^-1) | `整數型態` |
    | char | 2 bytes | 0 \~ 65535 | 值用單引號`' '`包起，被視為正整數 |
    | float | 4 bytes | -2^38^ \~ 2^38^-1 | `浮點常數` 字尾需加F，10進制精準⾄7位⼩數 |
    | **double** | 8 bytes || `浮點常數` 字尾需加D，10進制精準⾄15位⼩數 |
    | boolean | 1 byte | true / false ||
    - 整數型態，共四種
    - 整數常數(如：5)，共兩種，預設用int儲存
    - 整數表示
        - 可用 `_` 作為分隔符號
        - 2 進制 (binary)：開頭以「0b」表⽰，開頭數字0為正，1為負
        - 8 進制 (octal)：開頭以「0」表⽰
        - 16進制 (hexadecimal)：開頭以「0x」表⽰
        - 如: 17(10進制) = **0b**10001(2進制) = **0**21(8進制) = **0x**11(16進制)
    - 浮點常數(如：0.05)，共兩種，預設用double儲存，只能用近似值，無法使用 `==`
    
- **參考型態**
    | 型態 | 說明 |
    | -- | -- |
    | 字串型態(String) | 值用雙引號 `" "` 括起，使用+號串接 |
    | | |

## :triangular_flag_on_post: 文字類型
    Java預設使⽤Unicode編碼
    文字間用 + (加號)串接

- 字元類型
    - 只能儲存一個文字，需用 `' '` (單引號)包住,屬於基本類型
    - 跳脫字元(escaped character)
        - `\n` 換⾏ (line feed)
        - `\t` tab鍵 (horizontal tab)
        - `\b` 倒退鍵 (backspace)
        - `\r` return鍵 (carriage return)
        - `\f` 換⾴ (form feed)
        - `\’` 單引號 (single quote)
        - `\"` 雙引號 (double quote)
        - `\\` 反斜線 (backslash)
- 字串類型
    - 可儲存多個文字，需用 `" "` (雙引號)包住,不屬於基本類型

## :triangular_flag_on_post: 抽象類別、介面

### 抽象類別 abstract
* 抽象類可以包含抽象方法、具體方法和成員變數
* 不需覆寫所有 function，沒有覆寫的function 一樣可以 call
* 繼承的 function 可以覆寫
* 使用關鍵字 abstract 來定義抽象類、抽象方法
* 可以有建構子(constructor)
* 子類使用 extends
* 一個類只能繼承一個抽象類別

### 介面 interface
* 介面只能包含抽象方法和常數，不能有成員變數
* 介面可以宣告單一變數，通常IDE在執行時會自動補上 public static final 使之成為常數
* 使用關鍵字 interface 來定義介面
* 不可以有建構子(constructor)
* 子類使用 implements，可以多個 implements，並且需實作(覆寫)所有 function

## :triangular_flag_on_post: Lambda表達式 (箭頭函式)
可以將函數作為參數傳進方法中
```=java
(參數) -> 表達式
(參數) -> { 陳述; }

//寫法1
int addfn = (int a, int b) -> a + b;
//寫法2
int addfn = (int a, int b) -> { return a + b; };
//寫法3
int addfn = (a, b) -> a + b;
```