標籤:
(1)怎樣判斷對象是否可以轉換?參看執行個體: TestInstanceof.java
運行結果:
(2)運行TestCast.java
d=m;d=c;c=(Cat)m;出現錯誤
(3)運行ParentChildTest.java
1.程式運行結果是什嗎?
- 你如何解釋會得到這樣的輸出?
第一個輸出建立了一個Parent對象,所以調用父類的建構函式。
第二個輸出建立了一個Child對象,所以調用子類的建構函式。
將子類child對象賦值給父類,將父類覆蓋調用了子類的建立方法。
第四個parent.myValue++是對父類的變數進行運算,而parent.myValue()實際上調用的還是子類的構造方法。
第五個((Child)parent).myValue++強制類型轉化。
子類和父類具有相同的方法和欄位,定義的parent為父類,child為子類,所以parent調用父類的方法,child調用子類型的方法。子類中的myValue值代替或隱藏父類值。
3. 電腦是不會出錯的,之所以得到這樣的運行結果也是有原因的,那麼從這些運行結果中,你能總結出Java的哪些文法特性?
當子類與父類擁有一樣的方法,並且讓父類變數引用一個子類對象時,到底調用那個方法,由對象自己真實類型決定:對象時子類的,它就調用子類的方法,是父類型的,它就調用父類型的方法。
如果子類與父類有相同的欄位,則子類中的欄位會代替或隱藏父類的欄位,子類方法中訪問的是子類中的欄位(而不是父類中的欄位)。如果子類方法確實想訪問父類中被隱藏的同名欄位,可以用super關鍵字來訪問它。
如果子類被當作父類使用,則通過子類訪問的欄位是父類的。
閱讀並運行AboutException.java樣本
EmbedFinally.java程式啟動並執行結果
辨析:finally語句塊一定會執行嗎?
請通過 SystemExitAndFinally.java樣本程式回答上述問題
不一定執行。Try塊中有System.exit(0);這樣的語句,finally語句不會執行。
PrintExpressionStack.java樣本
Java異常處理總結:
一般構造如下
try{程式碼}catch(異常類型1 異常的變數名1){程式碼}catch(異常類型2 異常的變數名2){程式碼} finally{程式碼}
catah可以有多個,用來匹配多個異常,匹配上多個中的一個後,執行catch語句塊時僅僅執行匹配的異常。Catch的類型是自己定義的,表示代碼拋出異常類型,異常的變數名表示拋出的異常對象的引用。
ExceptionLinkInRealWorld.java運行
動手動腦:
實驗要求:
編寫一個程式,此程式在運行時要求使用者輸入一個 整數,代表某門課的考試成績,程式接著給出“不及格”、“及格”、“中”、“良”、“優”的結論。
原始碼:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// TODO 自動產生的方法存根
int n;
Scanner sc=new Scanner(System.in);
System.out.println("請輸入一個整數(0~100):");
int i=0; //控制出入正確時,判斷完成結束程式
for(;;) //迴圈,直到輸入正確
{
try
{
n=sc.nextInt();
if(n<0||n>100){ //判斷整數範圍是否正確
System.out.println("輸入整數不在範圍!");
}
else{
i=1;
if(n<60&&n>=0){
System.out.println("不及格");
}
else if(n<70){
System.out.println("及格");
}
else if(n<80){
System.out.println("中");
}
else if(n<90){
System.out.println("良");
}
else if(n<=100){
System.out.println("優");
}
}
}
catch(InputMismatchException e)
{
sc.next();//讀取到有效字元後才可以結束輸入
System.out.println("輸入格式不正確,請輸入整數(0~100)!");
}
if(i==1)//結束迴圈
{
break;
}
}
}
}
運行結果:
多態與異常處理