# 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{ ... } ``` # 物件導向的意義 - 結構分離,釋放記憶體(要用的時候才載入)