Java工程師培訓課(九)
Genius夜光序言:
因為你懂事,所以你總是受委屈。
因為你懂事,所以你總是被忽略。
因為你懂事,所以你總是愛受傷。
因為你懂事啊,所以你只能告訴自己,要懂事
正文:
1.配置PATH、CLASSPATH、JAVA_HOME的作用?(10分)
保證javac命令可以在任意目錄下執行。
保證class檔案可以在任意目錄下執行
方便修改內容是JDK的安裝路徑
2.java的基本資料型別分為四型八種,分別指那些?我們選擇資料型別的時候按照那種原則選用?(10分)
資料型別:byte、short、Int、long
浮點型別:float、double
布林型別:boolean
字元型別:char
選擇資料型別儘量用佔用位元組少的,這樣比較省空間。
3. 定義一個函式接收一個分數,然後判斷並輸出錄入的分數對應的等級。100-90 A級, 89-80 B級,79-70 C級 以此類推,一直到E級。(10分)
4. 定義一個程式。計算1-100奇數的總和,要求使用上continue關鍵字。(10分)
6. 自定義一個數組,使用氣泡排序思想對陣列的元素進行排序。(10分)
7. 定義一個函式,接收一個數組與一個要查詢的元素,如果該元素存在陣列中,那麼返回 該元素在陣列中的索引值,如果不存在返回-1。(不要嚴格要求使用二分查詢法) (10分)
8. 定義一個函式接收一個int型別的二維陣列,計算該二維陣列的所有元素之和,並且把總和返回給呼叫者。(10分)
9. 定義一個函式,接收一個數組,找出該陣列的最大值並在函式中直接輸出不用返回。 (10分)
10.定義一個函式,接收一個int型別的陣列,計算該陣列元素為偶數的總和返回給呼叫者(10分)
介面的基本語法
這邊有一個抽象類,所以必須要這樣書寫~~:
模組與模組之間的功能差不了太多的,一般情況下半天就可以了~~倘若一個個看會累死人的
老鐵,之後會發生一點事情,那就是財務那邊模組方法完全不一樣~~導致系統越改越不好,所以哥們,你不可以把你的風格帶到一個企業裡面~~
【專案經理一般都有六七年工作經驗了,專門負責寫介面,來約束下面的程式設計師來】
內部類
內部類的概述【夜光~~】
將類定義在另一個類的內部則成為內部類。其實就是類定義的位置發生了變化。
在一個類中,定義在類中的叫成員變數,定義在函式中的叫成員函式,那麼根據類定義的位置也可以分為成員內部類和區域性內部類。
備註:內部類生產的class檔案為 “外部類$內部類”,為了標明該內部類是屬於具體哪個外部類的。
成員內部類的訪問方式
- 內部類可以直接訪問外部類的成員屬性。(孫悟空相當於內部類飛到牛魔王的肚子裡面去)。
- 外部類需要訪問內部類的成員屬性時需要建立內部類的物件。
-
-
- 在外部類的成員函式中建立內部類的物件,通過內部類物件物件直接訪問內部類的成員。
- 在其他類中直接建立內部類的物件。
-
-
Outer.Inner inner = new Outer().new Inner();
外部類訪問內部類的屬性
有A類和B類,當A類想要直接訪問B類中的成員,而B類又需要建立A類的物件來A類中的成員。這時,就將A類定義成B類的內部類。比喻:孫悟空和鐵扇公主。孫悟空到了公主肚子中,就成了內部類(其實是持有外部類的物件引用)。
疑問: 什麼時候使用內部類呢?
當我們分析事物時,發現事物的內部還有具體的事物,這時則應該定義內部類了。
比如人體是一個類,人體有心臟,心臟的功能在直接訪問人體的其他內容。這時就將心臟定義在人體類中,作為內部類存在。
內部類的優勢:成員內部類作為外部類的成員,那麼可以訪問外部類的任意成員。
成員內部類訪問細節
如果內部類中包含有靜態成員,那麼java規定內部類必須宣告為靜態的訪問靜態內部類的形式:Outer.Inner in = new Outer.Inner();
總結:成員內部類(成員屬性、成員方法)特點:
- 私有的成員內部類
特點:不能在其他類中直接建立內部類物件來訪問
- 靜態的成員內部類
特點:如果內部類中包含有靜態成員,那麼java規定內部類必須宣告為靜的
訪問靜態內部類的形式:
Outer.Inner in = new Outer.Inner();
區域性內部類
區域性內部類概述:包含在外部類的函式中的內部類稱之為區域性內部類。
訪問:可以在包含區域性內部類的方法中直接建立區域性內部類的物件呼叫區域性內部類的成員。
注意:區域性內部類只能訪問所在函式的fanal屬性。
匿名內部類
匿名內部類:就是沒有類名字的內部類。
匿名內部類作用:簡化內部類書寫。
匿名內部類的前提:必須繼承一個父類或者是實現一個介面。
匿名內部類的格式:
new 父類或者介面(){ 執行程式碼….};
內部類的寫法:
class Outer{ class Inner { public void show(){ System.out.println("內部類的show方法"); } } public void print(){ new Inner().show(); } } |
匿名內部類呼叫show方法:
注意細節:
1.使用匿名內部類時,如果需要呼叫匿名內部類的兩個方法或者兩個方法以上。可以使用變數指向該物件。
- 異常
現實生活的病
現實生活中萬物在發展和變化會出現各種各樣不正常的現象。
1:例如:人的成長過程中會生病。
|——病
|——不可治癒(癌症晚期)
|——可治癒
|——小病自行解決(上火,牙痛)
|——去醫院(感冒,發燒)
java異常體系圖
現實生活中的很多病況從面向物件的角度考慮也是一類事物,可以定義為類。
java中可以通過類對這一類不正常的現象進行描述,並封裝為物件。
- java的異常體系包含在java.lang這個包預設不需要匯入。
- java異常體系
|——Throwable (實現類描述java的錯誤和異常)
|——Error (錯誤)一般不通過程式碼去處理。
|——Exceprion (異常)
|——RuntimeException (執行時異常)
|——非執行時異常
常見的Error
錯誤原因:找不到類檔案。
錯誤(Error):
它指的是一個合理的應用程式不能截獲的嚴重的問題。大多數都是反常的情況。錯誤是JVM的一個故障(雖然它可以是任何系統級的服務)。所以,錯誤是很難處理的,一般的開發人員(當然不是你)是無法處理這些錯誤的。比如記憶體溢位.
- 異常體系圖的對應
Throwable類
- toString() 輸出該異常的類名。
- getMessage() 輸出異常的資訊,需要通過構造方法傳入異常資訊(例如病態資訊)。
- printStackTrace() 列印棧資訊。
人生病:流鼻涕,感冒,呼吸道感染,肺炎。。。最後體現的是肺炎。
醫生要處理需要獲知這些資訊。從外到裡處理。最後找病源
/* Throwable類
printStackTrace() 列印棧資訊
肺炎 上呼吸道感染 發燒 流鼻涕感冒 小感冒 */ class Demo6 {
public static void main(String[] args) {
// Throwable able=new Throwable(); Throwable able = new Throwable("想吐。。。"); System.out.println(able.toString()); // 輸出該異常的類名 System.out.println(able.getMessage()); // 輸出異常的資訊 able.printStackTrace(); // 列印棧資訊 } } |
程式中的異常處理
- 當除數是非0,除法運算完畢,程式繼續執行。
- 當除數是0,程式發生異常,並且除法運算之後的程式碼停止執行。因為程式發生異常需要進行處理。
class Demo7 {
public static void main(String[] args) { div(2, 0); System.out.println("over"); }
public static void div(int x, int y) { //該行程式碼的y值可能是0,程式會出現異常並停止 System.out.println(x / y); System.out.println("除法運算"); } } //ArithmeticException |
疑問: 出現異常如何處理?
-
-
- 自行處理
-
- try{//可能發生異常的程式碼 }catch(異常類 變數名){//處理}。
- 案例除法運算的異常處理。
- 如果沒有進行try catch處理,出現異常程式就停止。進行處理後,程式會繼續執行。
class Demo7 {
public static void main(String[] args) { div(2, 0); System.out.println("over"); }
public static void div(int x, int y) {
try { System.out.println(x / y); // 可能出現異常的語句,放入try中。 } catch (ArithmeticException e) { // 進行異常匹配, //異常資訊 System.out.println(e.toString()); System.out.println(e.getMessage()); e.printStackTrace(); System.out.println("除數不能為0"); } System.out.println("除法運算"); } } |
多個異常
- 案例print方法,形參中增加陣列。
- 在print方法中運算元組會發生新的異常
ArrayIndexOutOfBoundsException,NullPointerException),如何處理?
-
-
-
- 使用將可能發生異常的程式碼放入try語句中,新增多個catch語句即可。
- 可以處理多種異常,但是同時只能處理一種異常。
- try中除0異常和陣列角標越界同時出現,只會處理一種。
-
-
public class Demo8 {
public static void main(String[] args) {
System.out.println(); int[] arr = { 1, 2 }; arr = null;
// print (1, 0, arr); print (1, 2, arr);
System.out.println("over"); }
public static void print(int x, int y, int[] arr) {
try { System.out.println(arr[1]); System.out.println(x / y); } catch (ArithmeticException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("算術異常。。。"); } catch (ArrayIndexOutOfBoundsException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("陣列角標越界。。。"); } catch (NullPointerException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("空指標異常。。。"); } System.out.println("函式執行完畢"); } } |
總結
- 程式中有多個語句可能發生異常,可以都放在try語句中。並匹配對個catch語句處理。
- 如果異常被catch匹配上,接著執行try{}catch(){} 後的語句。沒有匹配上程式停止。
- try中多個異常同時出現,只會處理第一條出現異常的一句,剩餘的異常不再處理。
- 使用多型機制處理異常。
-
-
- 程式中多型語句出現不同異常,出現了多個catch語句。簡化處理(相當於急診)。
- 使用多型,使用這些異常的父類進行接收。(父類引用接收子類物件)
-
-
public static void div(int x, int y, int[] arr, Father f) {
try { System.out.println(arr[1]); // 陣列越界 System.out.println(x / y); // 除零 Son s = (Son) f; // 型別轉換
} catch (Exception e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("出錯啦"); } System.out.println("函式執行完畢"); } |
多個catch語句之間的執行順序。
-
-
-
- 是進行順序執行,從上到下。
- 如果多個catch 內的異常有子父類關係。
-
-
- 子類異常在上,父類在最下。編譯通過執行沒有問題
- 父類異常在上,子類在下,編譯不通過。(因為父類可以將子類的異常處理,子類的catch處理不到)。
- 多個異常要按照子類和父類順序進行catch
-
-
-
-
class Father {
}
class Son extends Father {
}
public class Demo8 {
public static void main(String[] args) {
System.out.println(); int[] arr = { 1, 2 }; arr = null; Father f = new Father(); div(1, 0, arr, f);
System.out.println("over"); }
public static void div(int x, int y, int[] arr, Father f) {
try { System.out.println(arr[1]); System.out.println(x / y); Son s = (Son) f;
} catch (ArithmeticException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("算術異常。。。"); } catch (ArrayIndexOutOfBoundsException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("陣列角標越界。。。"); } catch (NullPointerException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("空指標異常。。。"); } catch (Exception e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("出錯啦"); } System.out.println("函式執行完畢"); } } |
總結
處理異常應該catch異常具體的子類,可以處理的更具體,不要為了簡化程式碼使用異常的父類。
疑惑:感覺異常沒有作用.
-
-
- 丟擲處理
-
定義一個功能,進行除法運算例如(div(int x,int y))如果除數為0,進行處理。
功能內部不想處理,或者處理不了。就丟擲使用throw new Exception("除數不能為0"); 進行丟擲。丟擲後需要在函式上進行宣告,告知呼叫函式者,我有異常,你需要處理如果函式上不進行throws 宣告,編譯會報錯。例如:未報告的異常 java.lang.Exception;必須對其進行捕捉或宣告以便丟擲throw new Exception("除數不能為0");
public static void div(int x, int y) throws Exception { // 宣告異常,通知方法呼叫者。
if (y == 0) { throw new Exception("除數為0"); // throw關鍵字後面接受的是具體的異常的物件 } System.out.println(x / y); System.out.println("除法運算"); } |
5:main方法中呼叫除法功能
呼叫到了一個可能會出現異常的函式,需要進行處理。
1:如果呼叫者沒有處理會編譯失敗。
如何處理聲明瞭異常的函式。
1:try{}catch(){}
public static void main(String[] args) {
try { div(2, 0); } catch (Exception e) { e.printStackTrace(); } System.out.println("over");
}
public static void div(int x, int y) throws Exception { // 宣告異常,通知方法呼叫者。
if (y == 0) { throw new Exception("除數為0"); // throw關鍵字後面接受的是具體的異常的物件 } System.out.println(x / y); System.out.println("除法運算"); } } |
2:繼續丟擲throws
class Demo9 {
public static void main(String[] args) throws Exception { div(2, 0); System.out.println("over"); }
public static void div(int x, int y) throws Exception { // 宣告異常,通知方法呼叫者。 if (y == 0) { throw new Exception("除數為0"); // throw關鍵字後面接受的是具體的異常的物件 }
System.out.println(x / y); System.out.println("除法運算"); } } |
throw和throws的區別
- 相同:都是用於做異常的丟擲處理的。
- 不同點:
- 使用的位置: throws 使用在函式上,throw使用在函式內
- 後面接受的內容的個數不同:
-
-
- throws 後跟的是異常類,可以跟多個,用逗號隔開。
- throw 後跟異常物件。
-
-
//throws 處理 public static void main(String[] args) throws InterruptedException { Object obj = new Object(); obj.wait();
} |
public static void main(String[] args) {
//try catch 處理 Object obj = new Object(); try { obj.wait(); } catch (InterruptedException e) {
e.printStackTrace(); }
} |
總結
-
-
-
- try語句不能單獨存在,可以和catch、finally組成 try...catch...finally、try...catch、try...finally三種結構。
- catch語句可以有一個或多個,finally語句最多一個,try、catch、finally這三個關鍵字均不能單獨使用。
- try、catch、finally三個程式碼塊中變數的作用域分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變數定義到這些塊的外面。
- 多個catch塊時候,Java虛擬機器會匹配其中一個異常類或其子類,就執行這個catch塊,而不會再執行別的catch塊。(子類在上,父類在下)。
- throw語句後不允許有緊跟其他語句,因為這些沒有機會執行。
- 如果一個方法呼叫了另外一個宣告丟擲異常的方法,那麼這個方法要麼處理異常,要麼宣告丟擲。
- 自定義異常
-
-
問題:現實中會出現新的病,就需要新的描述。
分析: java的面向物件思想將程式中出現的特有問題進行封裝。
案例: 定義功能模擬凌波登入。(例如:lb(String ip))需要接收ip地址
- 當沒有ip地址時,需要進行異常處理。
1. 當ip地址為null是需要throw new Exception("無法獲取ip");
2. 但Exception是個上層父類,這裡應該丟擲更具體的子類。
3. 可以自定義異常
- 自定義描述沒有IP地址的異常(NoIpException)。
1. 和sun的異常體系產生關係。繼承Exception類,自定義異常類名也要規範,結尾加上Exception,便於閱讀
/* 自定義異常 */ class NoIpException extends Exception {
NoIpException() {
}
NoIpException(String message) { super(message); }
}
class Demo10 {
public static void main(String[] args) throws NoIpException {
System.out.println(); String ip = "192.168.10.252"; ip = null; try { Lb(ip); } catch (NoIpException e) { System.out.println("程式結束"); }
}
/* * |