---
# System prepended metadata

title: class實作

---

# class實作
## 屬性 全域變數
專注於class的細節描述
```
public class 狗{
狗的叫聲
狗的品種
狗的體重...
...
}
```
- 安全修飾子共4個
    - private
    - public
    - 其餘兩種
- 型態設定為屬性型態
    - 例如在寫int會被自動轉換成Integer
- 無需初始化
    - 不用給值
    - 因為已經有預設值null（空）
- 讀取範圍在方法外、class內
```java=
private Integer id;

public void method01(){
    /*複習變數：
     *- 不能使用安全修飾子共4個
     *   - private
     *   - public
     *   - 其餘兩種
     *- 基本型態
     *- 需要初始化
     *   - 變數沒有預設值
     *- 讀取範圍得在方法內    
     */
     int x; //如果在這裡寫成Integer會被自動轉換成int
    ...println(x);
}
```
早期Java參考型態不能寫在方法內，因為有了自動轉化程式autoboxing/autounboxing才能這樣寫
- 補充：JUnit這個debugger工具可以不通過main method運行個別class，還能顯示運行時間
    - 只要輸入@Text滑鼠移過去就能新增
    - 沒有初始化不能測
    ```java=
    //這樣叫沒初始化
    Integer x;
    x=30;
    ```
    - 靜態方法也不能測試
        - 除非在其他method中被呼叫
    - [突然不能用的原因](https://www.cnblogs.com/sunTin/p/7797958.html)
        - 同package下新增到一個名稱衝突的檔案(Test.java)
        - 或只是IDE單純失靈，手動導入即可        - 或只是IDE單純失靈，手動輸入`import org.junit.jupiter.api.Test;`導入即可

## 常數
- 要在方法外
- 一定要為public
- 靜態static
- 運行後不可被改變final
- 要初始化
```java=
public static final int x=123; //加上final的，於其他程式呼叫時不能修改值
```
### 靜態
static method可以在任何地方直接呼叫
方法格式：
`classname.staticmethodname()`

常數也能被呼叫，格式如下：
`classname.name`
***
method甚至class也是可以寫死的：
```java=
public final void x(){ //但加上final的位置不太相同
    ...
}
```
## 建構子
- 建構子名稱要與class名稱一樣（含大小寫）
- 建構子無回傳概念，建構這個class，在建立實體就是`new xxx()`
- 建構子有傳入值，可以使用多載
    ```java=
    public class ClassObject {
        public ClassObject() {
            ...
        }
        public ClassObject(int x) {
            ...
        }
        public ClassObject(int a,int b) {
            ...
        }
    }
    ```
- 其實任何class都有，只是被隱藏了
- 不能放入方法
- 建構子（預設的）可以為屬性初始化值
    ```java=
    private String name; 
    ```
    選這裡：
    ![](https://i.imgur.com/oPD68Wq.png)
    初始化後出現的代碼中，`this.name`的`this`是指本身class；`super`是父類別class
    - 以下都得在第一行
        - `this();`呼叫本身無傳入值建構子
            - 做一個指定的動作
        - `super();`呼叫父類別無傳入值建構子
### 私有化（private）
- 會導致超出範圍的class/method不能呼叫它
## 方法與變數
大標題-屬性 全域變數的後方有提到；
可以針對屬性寫"功能性方法"，例如：登入功能、計算薪水加上獎金的功能

## enum
如果我在同個package右鍵新增某個enum
```java=
a,b,c,d,e
```
在個別class外，可以進行呼叫
```java=
//這是某個class的method內
switch(enumname.a){
    case a:
    ...println("a");
        break; //還有continue跟return可以使用
    case b:
    ...
        break;
    case c:
    ...
    case d:
    ...
    case e:
    ...
}
```
或是在某class內
```java=
private enum Text{ //命名大小寫都行，大小寫是不一樣的，同名的時候會先讀同class內private的（最近的）
    a,b,c,d
}
```
也可以寫在switch的case下方，變成巢狀結構的多重選擇

補充：Java的鍵盤輸入語法如下所示
```java=
Scanner keyin=new Scanner(System.in);
int x=keyin.nextInt();//掃描整數型態的內容
```
## [內/外部類別](/NShiO8gRTwiXZfO4dwq9iA)
## [匿名類別（略涉及）](/bronxBveRzenjhf-ZWDF-g)
## [匿名類別](/RfovOHSGSzauw-yOKPhg3A)
## 異常
- exception
    - error錯誤
        - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Error.html
        - 我方無法處理
    - exception異常
        - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Exception.html
        - 程式碼錯誤
        - 邏輯錯誤
            - 異常
            - 運行後異常
            - I/O
                - 資料庫
                - 網路
                - 檔案
- 需要處理異常的結構
    - 客戶輸入格式
    - 文件是某存在
    - 網路是否順暢
    - 資料庫是否開啟或建立
- 常見的異常
    - 輸入格式錯誤
        ```java=
        public void test01() {
            Scanner keyin=new Scanner(System.in);//鍵盤輸入
            int y=keyin.nextInt();//指定輸入格式
            System.out.println(y);
            keyin.close();//記得關閉輸入
        }
        ```
    - 超出陣列索引值
    - 數學錯誤
    - 型態轉換錯誤
    - 實體不存在
***
## 例外處理
- try...catch
    - 程式發生異常→JVM停止
    - 範例
    ```java=
    public class Demo03 {
        @Test
        public void test01() {
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(new File("hihi.txt"));
                int a;
                while ((a = fis.read()) != -1) {
                    System.out.println((char) a);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                try {
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }}
            } 
        }


    ```
- throws給另一個方法做try-catch
    - 什麼情形要拋/做
        - 假設一個程式有4層
            - 1（介面）
                - try-catch：顯示錯誤訊息 [錯誤訊息實作檔案](/HqffX2W-RmO_J5kwilNZ5w)
            - 2
                - 拋給1
                - 寫入Log檔
                    - 自保
                    - 錯誤追蹤
            - 底層
                - try-catch做完
***
- class的數目
    - 一個檔案可以有多個，==但並不建議==
    - 只能有一個public
        - 它會去找跟檔名相同的
    - 也不能加上private，寫成這樣就好：
    ```java=
    class Demo2{
        ...
    }
    ```
# 物件導向的意義
- 結構分離，釋放記憶體（要用的時候才載入）