繼承色洞、抽象類、接口冠胯、多態(tài)

  • 就是子類繼承父類的屬性和方法火诸,使得子類對象具有與父類相同的屬性和方法,子類可以訪問父類中非私有的屬性和行為荠察。

好處:
提高代碼的復用性
類與類之間產生了關系置蜀,這將是多態(tài)的前提

格式

public class 父類{
  ...
}
public class 子類 extends 父類{
  ...
}
繼承的特點
  • 成員變量重復奈搜,子類覆蓋父類
  • 子類訪問父類中非私有變量,使用super關鍵字類似于this盯荤。
super.父類成員變量名
  • 成員方法不重名 無影響
  • 成員方法重名(@Override)
    方法的重寫
    子父類中出現(xiàn)的重名的成員方法
    (返回值類型,方法名馋吗,參數(shù)列表)完全相同
    聲明不變重新實現(xiàn)

注意

子類覆蓋父類方法時,必須保證權限大于等于父類

  • 繼承后構造方法的特點
    回憶:
  1. 與類名一致的特殊方法秋秤,所以子類無法繼承父類的構造方法的
  2. 作用是初始化成員變量宏粤,所以子類初始化過程中,必須先初始化父類灼卢,子類的構造方法中默認有一個super()商架,表示調用父類的構造方法,父類的成員初始化后才可以給子類使用

super和this

  • super 代表父類的存儲空間和標識(父類的引用)
  • this代表當前對象的引用
this.成員變量 本類
super.成員變量 父類

this.成員方法() 本類
super.成員方法() 父類

2芥玉、訪問構造方法

this() 本類構造方法
super()父類構造方法

子類中的構造方法中均有默認的super()蛇摸, 調用父類的空參構造,手動調用會覆蓋默認的super()、super()和this()都必須在構造方法的第一行灿巧,所以不能同時出現(xiàn)

繼承的特點

  1. JAVA只支持單繼承赶袄,不支持多繼承
class C extend A{}  //ok
class C extend A,B{}  //no
  1. Java支持多層繼承
頂層父類默認都是繼承Object類
  1. 子類和父類是一種相對的概念

抽象類

what is 抽象方法(民工英語)
抽象方法: 沒有方法體的方法。(只有方法聲明沒有方法實現(xiàn))

 public abstract void main();
  • 格式
修飾符 abstract 返回值類型 方法名(參數(shù)列表)

抽象類:如果一個類包含抽象方法抠藕,那么該類必須是抽象類饿肺。

  • 格式
abstract class 類名{
}

抽象類的使用

繼承抽象類的子類必須重寫父類的所有抽象方法,否則盾似,該子類也必須聲明為抽象類敬辣,最終必須有子類實現(xiàn)該父類的抽象方法。
否則從最初的父類到最終的子類都不能創(chuàng)建對象零院,失去了意義溉跃。

  • 對于父類抽象方法的重寫,我們一般叫做方法的實現(xiàn)告抄。

注意事項

  • 抽象類不能被創(chuàng)建對象
  • 抽象類中撰茎,可以有構造方法,是供子類創(chuàng)建對象打洼,是初始化父類成員
  • 抽象類中龄糊,不一定有抽象方法,但是有抽象方法的一定是抽象類(未包含抽象方法的類目的是不想讓調用者創(chuàng)建該類對象募疮,通常用于某些特殊的類結構設計)
  • 抽象類的子類必須重寫父類的所有抽象方法炫惩,除非該子類也是抽象類

綜合練習

搶紅包
需求: 群主發(fā)普通紅包,某群有多名成員阿浓,群主給成員發(fā)普通紅包他嚷,規(guī)則為:
1.群主有一筆金額,從群主的余額中扣除,平均分成n等分爸舒,讓成員去領
2.成員領取紅包后保存到余額中
User: 用戶名 余額 展示信息
Manager: 群主類 發(fā)紅包
Member: 成員類 收紅包

User類

package RedBag;

public class User {
    private String userName;
    private int leftMonney;
    public User() {

    }

    public User(String userName, int leftMonney) {
        this.userName = userName;
        this.leftMonney = leftMonney;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getLeftMonney() {
        return leftMonney;
    }

    public void setLeftMonney(int leftMonney) {
        this.leftMonney = leftMonney;
    }
    public void show() {
        System.out.println("用戶" + userName + "\t" + "余額為"+ leftMonney);
    }
}


Manage類


package RedBag;

import java.util.ArrayList;

public class Manage extends User {
    public Manage () {

    }
    public Manage (String userName, int leftMoney) {
        super(userName, leftMoney);
    }
    // 發(fā)紅包
    public ArrayList<Integer> send(int totalMoney, int count){
        ArrayList<Integer> redList = new ArrayList<>();
        int leftMoney = super.getLeftMonney();
        if(totalMoney > leftMoney){
            System.out.println("余額不足");
        }
        super.setLeftMonney(leftMoney - totalMoney);
        int avg = totalMoney / count;
        int mod = totalMoney % count;
        for (int i = 0; i < count - 1; i++){
            redList.add(avg);
        }
        redList.add(avg + mod);
        return  redList;
    }
}


Memory類

package RedBag;

import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.Random;

public class Memory extends User{
    public Memory(){}
    public Memory(String userName, int leftMoney){
        super(userName, leftMoney);
    }

    //收紅包
    public void receive(ArrayList<Integer> list){
        Random random = new Random();
        int index = random.nextInt(list.size());
        Integer removeMoney = list.remove(index);
        int leftMoney = super.getLeftMonney();
        int updateMoney = leftMoney + removeMoney;
        super.setLeftMonney(updateMoney);
    }
}


Test類

package RedBag;

import java.lang.reflect.Member;
import java.util.ArrayList;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
       Manage manage = new Manage("群主", 200);
       Memory memory1 = new Memory("成員",  0);
       Memory memory2 = new Memory("成員",  0);
       Memory memory3 = new Memory("成員",  0);
       manage.show();
       memory1.show();
       memory2.show();
       memory3.show();
       Scanner scanner = new Scanner(System.in);
       System.out.println("請輸入金額");
       int money = scanner.nextInt();
       System.out.println("請輸入發(fā)幾個紅包");
       int count = scanner.nextInt();
       ArrayList<Integer> redList = manage.send( money, count);
       memory1.receive(redList);
       memory2.receive(redList);
       memory3.receive(redList);
       manage.show();
       memory1.show();
       memory2.show();
       memory3.show();
    }
}

自己寫的

package RedBack;

import java.util.Scanner;

public class Manager {
    int moneyM = 200;
    static int num = 0;
    static int fa;

    Scanner getMoney = new Scanner(System.in);
    void faRed (){
        System.out.println("請輸入金額");
        fa += getMoney.nextInt();
        System.out.println("請輸入發(fā)幾個紅包");
        num += getMoney.nextInt();
        System.out.println("用戶群主余額問為"+ (moneyM - fa) +"元");

    }
}

package RedBack;

import java.util.ArrayList;
import java.util.Random;

public class User extends Manager {
    ArrayList<String> userNames = new ArrayList<>();
    ArrayList<Integer> money = new ArrayList<>();
    Random random = new Random();

    void userSet () {
        super.faRed();
//        System.out.println(num);
        int ranMoney = 0;
        for (int i = 0; i < num; i++) {
            userNames.add("用戶成員" + (char)(65 + i));
            money.add(random.nextInt(50));
            System.out.println(money.get(i));
        }
        int ra =  random.nextInt(userNames.size());
        for (int i = 0; i < num; i++) {
            int sFA = fa / 3;
            int mod = fa % 3;
//            System.out.println(fa);
            if(i == ra){
                System.out.println(userNames.get(i)+(money.get(i)+ sFA + mod)+"元");
            }else{
                System.out.println(userNames.get(i)+(money.get(i)+ sFA)+ "元");
            }
        }

    }
    void showMsg(){
        for (int i = 0; i < num; i++) {
            System.out.println(userNames.get(i)+money.get(i)+"元");
        }
    }
}


package RedBack;

public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.userSet();
//        user.showMsg();
    }
}


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蟋字,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扭勉,更是在濱河造成了極大的恐慌鹊奖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涂炎,死亡現(xiàn)場離奇詭異忠聚,居然都是意外死亡,警方通過查閱死者的電腦和手機唱捣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門两蟀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人震缭,你說我怎么就攤上這事赂毯。” “怎么了拣宰?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵党涕,是天一觀的道長。 經常有香客問我巡社,道長膛堤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任晌该,我火速辦了婚禮肥荔,結果婚禮上,老公的妹妹穿的比我還像新娘朝群。我一直安慰自己燕耿,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布潜圃。 她就那樣靜靜地躺著缸棵,像睡著了一般舟茶。 火紅的嫁衣襯著肌膚如雪谭期。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天吧凉,我揣著相機與錄音隧出,去河邊找鬼。 笑死阀捅,一個胖子當著我的面吹牛胀瞪,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凄诞,長吁一口氣:“原來是場噩夢啊……” “哼圆雁!你這毒婦竟也來了?” 一聲冷哼從身側響起帆谍,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伪朽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汛蝙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烈涮,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年窖剑,在試婚紗的時候發(fā)現(xiàn)自己被綠了坚洽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡西土,死狀恐怖讶舰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情需了,我是刑警寧澤绘雁,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站援所,受9級特大地震影響庐舟,放射性物質發(fā)生泄漏。R本人自食惡果不足惜住拭,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一挪略、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滔岳,春花似錦杠娱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刘离,卻和暖如春室叉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硫惕。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工茧痕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恼除。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓踪旷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子令野,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355