DAY09 復習
1 面向物件之多型
1. 前提:繼承+重寫
2. 口訣1:父類參考指向子類物件
解釋:父型別別的參考型別變數保存的是子型別別的物件的地址值
3. 口訣2:編譯看左邊,運行看右邊
解釋:編譯時要看父類是否定義了這個資源,運行時使用的是子類的功能
4. 資源使用情況
- 成員變數使用的是父類的
- 成員方法使用的是父類的方法定義,子類的方法體
- 如果多型物件呼叫的是子類沒有重寫過的方法,方法定義與方法體使用的都是父類的,所以這個不符合多型的前提,直接使用純純的父類物件呼叫即可
- 靜態資源屬于類資源,隨著類的加載而加載,只會加載一次,優先于物件進行加載,可以通過類名直接呼叫,被全域所有物件共享,所以靜態不存在重寫的現象,在哪個類定義,就屬于哪個類的資源
- 我們現在學習的多型,把自己看作是父型別別,參考“花木蘭替父從軍”
2 例外
1. 例外的繼承結構
例外層次結構中的根是Throwable
Error:目前我們編碼解決不了的問題
Exception:例外
編譯例外:未運行代碼就報錯了,強制要求處理
運行時例外:運行代碼才報錯,可以通過編譯,不強制要求處理
2.例外的解決方案
1. 捕獲處理try-catch–自己解決
例外捕獲處理的格式:
try{
可能會拋出例外的代碼
}catch(例外的型別 例外的名字){
萬一捕獲到了例外,進行處理的解決方案
}
- try-catch結構可以嵌套,如果有多種例外型別需要特殊處理的話
- 使用多型的思想,不論是什么子例外,統一看作父型別Exception
做出更加通用的解決方案,甚至可以只寫這一個
2.向上拋出throws–交給別人解決
例外拋出的格式:
在方法的小括號與大括號之間,寫:throws 例外型別
如果有多個例外,使用逗號分隔即可
private static void method3() throws ArithmeticException,InputMismatchException,Exception{ }
private static void method3() throws Exception{ }
- 如果一個方法拋出了例外,那么誰來呼叫這個方法,誰就需要處理這個例外,這里的處理也有兩種方案:捕獲解決 或者 繼續向上拋出
- 不能直接把例外拋給main(),因為呼叫main()是JVM,沒人解決了,該報錯還報錯,所以我們一般會在main()呼叫之前將例外解決掉
3. 抽象
1.抽象類
- 被關鍵字abstract修飾的類是抽象類
- 一旦一個類中包含了抽象方法,那么這個類必須被宣告成一個抽象類
- 抽象類中的方法不做限制,非常自由:全普 / 全抽 / 半普半抽
- 抽象類不可以實體化–創建物件
- 抽象類有構造方法,它自己不用,但是為了子類創建物件時呼叫
- 如果一個子類繼承了抽象父類,那么有兩種解決方案:
1)作為一個抽象子類:不實作/實作部分抽象父類的抽象方法,躺平
2)作為一個普通子類:需要實作抽象父類的全部抽象方法,還債
2 抽象方法
- 被關鍵字abstract 修飾的方法就是抽象方法
- 抽象方法沒有方法體{ },直接以分號結束
3 練習1
package cn.tedu.exec;
/*本類用于OOP綜合練習1*/
public class TestAnimal {
public static void main(String[] args) {
//創建螞蟻類的物件--子類物件
Ant a = new Ant();
//創建蜜蜂類的物件--子類物件
Bee b = new Bee();
a.fly();//呼叫子類的特有方法
a.layEggs();//呼叫子類繼承的方法
b.makeHoney();//呼叫子類的特有方法
b.layEggs();//呼叫子類繼承的方法
}
}
//1.抽象形成一個父類
abstract class Animal{
//2.創建屬性
int legNumbers;//腿的數量
int eggNumbers;//下蛋的數量
//3.創建下蛋的功能
public abstract void layEggs();
}
//4.創建子類螞蟻類
class Ant extends Animal{
//4.2添加子類的特有屬性
int eggNumbers = 2;//螞蟻一次產2個卵
//4.1創建子類的特有功能
public void fly(){
System.out.println("螞蟻飛啦~");
}
//4.3添加子類重寫的方法
@Override
public void layEggs(){
System.out.println("螞蟻產卵的數量為:"+eggNumbers);
}
}
//5.創建子類蜜蜂類
class Bee extends Animal{
//5.2添加子類的特有屬性
int eggNumbers = 10;//蜜蜂一次產10個卵
//5.1創建子類的特有功能
public void makeHoney(){
System.out.println("蜜蜂在產蜂蜜");
}
//5.3添加子類重寫的方法
@Override
public void layEggs(){
System.out.println("蜜蜂產卵的數量為:"+eggNumbers);
}
}
3 練習2-1 士兵類
package cn.tedu.exec2;
import java.util.Random;
/*OOP綜合案例3-士兵類*/
//1.定義士兵類
public class Soldier {
//2.定義士兵類的屬性
int id;//士兵編號
int blood = 100;//默認血量值100
AK47 a;//參考型別AK47作為屬性,相當于給士兵配槍,a的默認值是null
//3.1定義士兵類的方法1
public void go(){
System.out.println(this.id+"號士兵在前進~");
}
//3.2定義士兵類的方法2
public void attack(){
//4.在攻擊之前先判斷這個士兵是否還活著,如果陣亡,直接結束當前攻擊方法
if(blood == 0){
System.out.println("這是"+id+"號士兵的尸體,");
return;/*直接結束當前方法attack()*/
}
System.out.println(id+"號士兵在進攻!");
if(a != null){
a.fire();//呼叫AK47發射子彈的開火方法
}
//1.生成一個亂數d,模擬進攻掉血的掉血量,亂數的范圍是[0,10)
int d = new Random().nextInt(10);//[0,10)
blood = blood - d;//減去血量
//2.血量最多減到0,如果出現負數,重置成0
if(blood < 0){
blood = 0;
}
//3.當血量為0時,說明士兵陣亡
if(blood == 0){
System.out.println(id+"號士兵已陣亡,");
}
}
}
3 練習2-2 武器AK47類
package cn.tedu.exec2;
import java.util.Random;
/*OOP綜合案例3-武器類*/
public class AK47 {
//1.定義屬性
int bullets = 100;//定義子彈的初始值為100發
//2.1定義功能1--開火功能
public void fire(){
//2.1首先判斷是否有子彈,如果沒有子彈,直接結束當前方法
if(bullets == 0){
System.out.println("沒有子彈了!!!");
return;
}
//2.2生成一個隨機值作為本次發射子彈的數量,范圍:[0,10)
int r = new Random().nextInt(10);
//2.3判斷實際子彈數是否夠用,有多少發多少
if(r>bullets){
r = bullets;//將當前的實際子彈數賦值給亂數r
}
bullets = bullets -r;//發射子彈
//2.4為了游戲效果,發射幾發子彈就在控制臺列印幾個突
for (int i = 0; i < r; i++) {
System.out.print("突");//本輪列印的都在同一行
}
System.out.println("~");
//2.5如果子彈數為0,提示用戶彈夾空了
if(bullets == 0){
System.out.println("彈夾空了~");
}
}
//2.2定義功能2--裝載子彈的功能
public void load(){
bullets = 100;
System.out.println("彈夾已裝滿");
}
}
4 練習2-3 測驗類1
package cn.tedu.exec2;
import java.util.Scanner;
/*本類用作士兵類的測驗類*/
public class TestDemo1 {
public static void main(String[] args) {
//1.新建AK47物件
AK47 a = new AK47();
System.out.println("按回車射擊,輸入load裝載子彈");
while(true){
String s = new Scanner(System.in).nextLine();
if(s.equals("load")){
a.load();
continue;
}
a.fire();
}
}
}
4 練習2-4 測驗類2
package cn.cxy.exec2;
public class TestDemo2 {
public static void main(String[] args) {
//新建 Soldier 士兵物件
//記憶體地址,保存到變數s1
Soldier s1 = new Soldier();
Soldier s2 = new Soldier();
//用s1參考第一個士兵物件
//為它的id賦值
s1.id = 9527;
s2.id = 9528;
//用s1找到第一個士兵物件
//讓第一個士兵執行go()方法代碼
s1.go();
s2.go();
//新建 AK47 物件,保存到s1.a
s1.a = new AK47();
s2.a = new AK47();
s2.attack();
s2.attack();
s2.attack();
s2.attack();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/317907.html
標籤:java
上一篇:【Java系列】玩轉Java——Java中的資料型別與運算子!
下一篇:團團的踩坑日記(快取篇)
