第六章與第七章學習筆記
一、教材學習內容(6.藉口與實現&7.內部類和異常)
1、使用interface定義一個介面,介面體中包含常量的宣告和抽象方法兩個部分
interface Printable{
final int Max=100; //這裡等同於int Max=100
void add(); //這裡等同於public abstract void add()
}
2、介面的實現(抽象方法)依賴於實現了此介面的類的方法重寫,特別地,類重寫的方法前一定要明顯地用public修飾(普通類方法預設為友好類)並且去掉abstract修飾符。
3、定義介面時,若interface前加上public關鍵字,就稱這樣的介面是一個public介面,public介面可以被任何一個類實現。若一個介面不加上public修飾,就稱作友好藉口,友好藉口可以被與該介面在同一包中的類實現。
4、如果父類實現了某個介面,那麼子類也就自然實現了該介面,子類不必在顯式地使用關鍵字impltements宣告實現這個介面。
5、介面也可被繼承。
6、介面回撥:可以把實現了某一介面的類建立的對線引用賦值給該介面宣告的介面變數,那麼該介面變數就可以使用被該類實現的介面方法。(介面變數無法呼叫類中其他的非介面方法)
7、介面可以抽象出重要的行為準則,該行為準則用抽象方法表示。介面的思想在於他可以要求某些類有相同的方法名稱,但方法的具體實現可以不同。
8、介面與多型:介面產生的多型性就是指不同的類在實現某一介面時可以具有不同的實現方式,那麼介面變數在回撥介面方法時就具有多種形態。
9、Java支援一個類中定義另一個類,這樣的類被稱為內部類,而包含內部類的類被稱為內部類的外嵌類。
特別地,此兩類間有以下的關係:
1)內部類的外嵌類的成員變數在內部類中仍然有效,內部類中的方法也可以呼叫外嵌類的方法。
2)內部類的類體中不可以宣告類變數和類方法(static,此處告訴我們內部類並不一定與外嵌類同時創立)。外嵌類的類體中可以用內部類宣告物件,作為外嵌類的成員。
3)內部類僅供它的外嵌類使用,其他類不可以用某個類的內部類宣告物件。
10、內部類可以被static修飾符修飾(static內部類),特別地,static內部類不能操作外嵌類中的例項成員變數。
11、建立子類物件時,除了使用父類的構造方法外還有類體,此類體被認為是一個子類去掉類聲明後的類體,稱作匿名類。
特別地,匿名類具有以下特點
1)匿名類可以繼承父類的方法也可以重寫父類的方法
2)使用匿名類時,必然是在某個類中直接使用匿名類建立物件,因此匿名類一定是內部類
3)匿名類可以訪問外嵌類中的成員變數和方法,匿名類的類體中不可以宣告static成員變數和方法(同內部類定義)
4)由於內部類是一個子類,但沒有類名,所以在用內部類建立物件時,要直接使用父類的構造方法
public class Example7_2 {
public static void main(String args[]) {
ShowBoard board=new ShowBoard();
board.showMess(new OutputEnglish()); //向引數傳遞OutputAlphabet的子類物件
board.showMess(new OutputAlphabet()
//向引數傳遞OutputAlphabet的匿名子類物件
{ public void output()
{ for(char c='α';c<='ω';c++) //輸出希臘字母
System.out.printf("%3c",c);
}
}
);
}
}
abstract class OutputAlphabet {
public abstract void output();
}
public class OutputEnglish extends OutputAlphabet {
public void output() {
for(char c='a';c<='z';c++) {
System.out.printf("%3c",c);
}
}
}
public class ShowBoard {
void showMess(OutputAlphabet show) {
show.output();
}
}
12、與介面有關的匿名類:利用介面回撥重寫介面類方法。
interface SpeakHello {
void speak();
}
class HelloMachine {
public void turnOn(SpeakHello hello) {
hello.speak();
}
}
public class Example7_3 {
public static void main(String args[]) {
HelloMachine machine = new HelloMachine();
machine.turnOn( new SpeakHello(){
public void speak() {
System.out.println("hello,you are welcome!");
}
}
);
machine.turnOn( new SpeakHello(){
public void speak() {
System.out.println("你好,歡迎光臨!");
}
}
);
}
}
13、異常類:Java使用throw關鍵字丟擲一個Exception子類的例項表示異常發。當方法呼叫過程中出現異常物件,允許終止當前方法的繼續執行。
14、try—catch語句:try部分的語句負責丟擲異常,catch部分的語句負責處理異常,特別地,catch引數中的異常類都是Exception的某個子類,表明try部分可能發生的異常,這些子類間不能有父子繼承關係。
public class Example7_4 {
public static void main(String args[ ]) {
int n = 0,m = 0,t = 1000;
try{ m = Integer.parseInt("8888");
n = Integer.parseInt("ab89"); //發生異常,轉向catch
t = 7777; //t沒有機會被賦值
}
catch(NumberFormatException e) {
System.out.println("發生異常:"+e.getMessage());
}
System.out.println("n="+n+",m="+m+",t="+t);
try{ System.out.println("故意丟擲I/O異常!");
throw new java.io.IOException("我是故意的");
//System.out.println("這個輸出語句肯定沒有機會執行,所以必須註釋掉,否則編譯出錯");
}
catch(java.io.IOException e) {
System.out.println("發生異常:"+e.getMessage());
}
}
}
15、可以擴充套件Exception類定義自己的異常類,然後根據程式的需要來規定哪些方法產生這樣的異常。一個方法在宣告時可以使用throws關鍵字宣告要產生的若干個異常,並在該方法的方法體中具體給出產生異常的操作,即用相應的異常類建立物件,並用throw關鍵字丟擲該異常物件,導致該方法結束執行。
16、throw(丟擲出現異常的物件)和throws(宣告產生的若干個異常)是不同的關鍵字。
17、
public class Example7_5 {
public static void main(String args[]) {
Bank bank=new Bank();
try{ bank.income(200,-100);
bank.income(300,-100);
bank.income(400,-100);
System.out.printf("銀行目前有%d元\n",bank.getMoney());
bank.income(200, 100);
bank.income(99999,-100);
}
catch(BankException e) {
System.out.println("計算收益的過程出現如下問題:");
System.out.println(e.warnMess());
}
System.out.printf("銀行目前有%d元\n",bank.getMoney());
}
}
public class Bank {
private int money;
public void income(int in,int out) throws BankException {
if(in<=0||out>=0||in+out<=0) {
throw new BankException(in,out); //方法丟擲異常,導致方法結束
}
int netIncome=in+out;
System.out.printf("本次計算出的純收入是:%d元\n",netIncome);
money=money+netIncome;
}
public int getMoney() {
return money;
}
}
public class BankException extends Exception {
String message;
public BankException(int m,int n) {
message="入賬資金"+m+"是負數或支出"+n+"是正數,不符合系統要求.";
}
public String warnMess() {
return message;
}
}
16、finally語句在catch後一定會執行!
17、異常類總結:Java使用try-catch語句來處理異常,將可能出現的異常操作放在try部分,當try部分中的某個方法調用出現異常時,try部分將立刻停止執行,轉向相應的catch操作。
二、教材學習中的問題和解決過程
暫無
三、程式碼除錯過程中的問題
暫無
四、學習思考和感悟
暫無