抽象类可以创建对象吗_【基础篇】java-抽象类与继承的补充
##抽象類##
- 概述
在繼承和多態時,講到了父類的方法多數時候,是要被子類們重寫,且各自的實現不盡相同。那么對于父類來說,其方法聲明還有用,方法體就沒用了,這樣在父類中,就只保留方法的聲明和空的方法體。這種沒有方法體的方法稱為抽象方法。java語言規定,包含抽象方法的類就是抽象類。
- abstract關鍵字
使用abstract關鍵字修飾抽象類以及抽象方法,例如:
public abstract class Animal {
public abstract void run();
}
- 抽象類的使用規定
繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須聲明為抽象類。最終,必須有子類實現該父
類的抽象方法,否則,從最初的父類到最終的子類都不能創建對象,失去意義。
1. 抽象類不能創建對象,如果創建,編譯無法通過而報錯。只能創建其非抽象子類的對象。
2. 抽象類中,可以有構造方法,是供子類創建對象時,初始化父類成員使用的。
3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。
這些也好理解,首先定義抽象類,目的就是不想讓創建該類對象,只需要對子類創建對象即可,而子類在創建對象的時候,要先初始化父類,所以抽象類是可以有構造方法的,子類是可以生成對象的,所以就不能包含抽象方法,所以類中要對父類的抽象方法全部進行重寫覆蓋。
# 繼承的綜合案例 #
- 需求分析:
群主發普通紅包。某群有多名成員,群主給成員發普通紅包。普通紅包的規則:
1. 群主的一筆金額,從群主余額中扣除,平均分成n等份,讓成員領取。
2. 成員領取紅包后,保存到成員余額中。
請根據描述,完成案例中所有類的定義以及指定類之間的繼承關系,并完成發紅包的操作。
-案例分析
一個父類user,兩個成員變量username與money,一個成員方法show;子類一群主,自定義方法發紅包;子類二成員類,自定義方法收紅包;
-案例實現
定義用戶類
public class User{private String suername;private double money;public User(){}public User(String username,double money){this.username = username;this.money = money;}public String getUsername(){return username;}public String setUsername(String username){this.username = username;}public String getMoney(){return money;}public String setMoney(double money){this.money = money;}public void show(){System.out,println("用戶名:"+username+",余額為:"+money+"元");} }定義群主類
public class QunZhu extenmds User{public QunZhu(){}public QunZhu(String username,double money){super(username, leftMoney);}/* 群主發紅包,就是把一個整數的金額,分層若干等份。 1.獲取群主余額,是否夠發紅包. 不能則返回null,并提示. 能則繼續. 2.修改群主余額. 3.拆分紅包. 3.1.如果能整除,那么就平均分。 3.2.如果不能整除,那么就把余數分給最后一份。 */ public ArrayList<Double> send(jint money,int count){double leftMoney = getMoney();if(money>leftMoney){return null;}setMoney(leftMoney - money);ArrayList<Double> list = new ArrayList<>();money = money * 100;// 每份的金額int m = money / count;// 不能整除的余數int l = money % count;// 無論是否整除,n‐1份,都是每份的等額金額 for(inti=0;i<count‐1;i++){// 縮小100倍,折算成 '元' list.add(m/100.0);}// 判斷是否整除 if(l==0){// 能整除, 最后一份金額,與之前每份金額一致 list.add(m/100.0);}else{// 不能整除, 最后一份的金額,是之前每份金額+余數金額 list.add((m+l)/100.00);}// 返回集合 return list;} }定義成員類
public class Member extends User {public Member() {}public Member(String username, double leftMoney) {super(username, leftMoney);}// 打開紅包,就是從集合中,隨機取出一份,保存到自己的余額中public void openHongbao(ArrayList<Double> list) {// 創建Random對象 Random r = new Random(); // 隨機生成一個角標 int index = r.nextInt(list.size()); // 移除一個金額Double money = list.remove(index);// 直接調用父類方法,設置到余額 setMoney(money);} }定義測試類:
public class Test {public static void main(String[] args) {// 創建一個群主對象QunZhu qz = new QunZhu("群主" , 200);// 創建一個鍵盤錄入 Scanner sc = new Scanner(); System.out.println("請輸入金額:");int money = sc.nextInt();System.out.println("請輸入個數:");int count = sc.nextInt();// 發送紅包 ArrayList<Double> sendList = qz.send(money,count);// 判斷,如果余額不足if(sendList == null){System.out.println(" 余額不足...");return;}// 創建三個成員Member m = new Member();Member m2 = new Member();Member m3 = new Member();// 打開紅包 m.openHongbao(sendList);m2.openHongbao(sendList);m3.openHongbao(sendList); // 展示信息 qz.show();m.show();m2.show();m3.show();} }總結
以上是生活随笔為你收集整理的抽象类可以创建对象吗_【基础篇】java-抽象类与继承的补充的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提供流水是什么意思
- 下一篇: fillna函数_听说这些pandas函