04-03 【final魏保、權限、內(nèi)部類摸屠、引用類型】

第一章final關鍵字


1.1 概述


學習了繼承后谓罗,我們知道,子類可以在父類的基礎上改寫父類內(nèi)容季二,比如檩咱,方法重寫。那么我們能不能隨意的繼承API中提供的類胯舷,改寫其內(nèi)容呢刻蚯?顯然這是不合適的。為了避免這種隨意改寫的情況桑嘶,Java提供了 final 關鍵字炊汹, 用于修飾不可改變內(nèi)容。

  • final:不可改變逃顶√直悖可以用于修飾類、方法和變量以政。
    • 類:被修飾的類霸褒,不能被繼承。
    • 方法:被修飾的方法盈蛮,不能被重寫废菱。
    • 變量:被修飾的變量,不能被重新賦值抖誉。

1.2 使用方式


修飾類

格式如下:

final class 類名 {

} 

查詢 API 發(fā)現(xiàn)像 public final class St ring殊轴、public final class Mathpublic final class Scanner 等寸五,很多我們學習過的類梳凛,都是被final修飾的,目的就是供我們使用梳杏,而不讓我們所以改變其內(nèi)容韧拒。

修飾方法

格式如下:

修飾符 final 返回值類型 方法名(參數(shù)列表){ 
    // 方法體
}

重寫被final修飾的方法淹接,編譯時就會報錯。

修飾變量
  1. 局部變量——基本類型
    基本類型的局部變量叛溢,被final修飾后塑悼,只能賦值一次,不能再更改楷掉。
    代碼如下:
public class FinalDemo1 {
    public static void main(String[] args) {
        //聲明變量厢蒜,使用final修飾
        final int a;
        // 第一次賦值
        a = 10;
        // 第二次賦值
        a = 20; // 報錯,不可重新賦值

        //聲明變量,直接賦值烹植,使用final修飾 
        final int b = 10;
        // 第二次賦值
        b = 20; // 報錯,不可重新賦值
    }
}

思考斑鸦,如下兩種寫法,哪種可以通過編譯草雕?
寫法1:

final int c = 0;
for (int i = 0; i < 10; i++) {
    c = i;
    System.out.println(c);
}

寫法2:

for (int i = 0; i < 10; i++) { 
    final int c = i; 
    System.out.println(c);
}

根據(jù)final的定義巷屿,寫法1報錯!寫法2,為什么通過編譯呢墩虹?因為每次循環(huán)嘱巾,都是一次新的變量C。這也是大家需要注意的地方诫钓。

  1. 局部變量——引用類型
    引用類型的局部變量旬昭,被final修飾后,只能指向一個對象菌湃,地址不能再更改问拘。但是不影響對象內(nèi)部的成員變量值的 修改,代碼如下:
public class FinalDemo2 {
    public static void main(String[] args) {
        // 創(chuàng)建 User 對象
        final User u = new User();
        // 創(chuàng)建 另一個 User 對象
        u = new User(); // 報錯慢味,指向了新的對象场梆,地址值改變。

        // 調(diào)用 setName 方法     
        u.setName(" 張三 "); // 可以修改
    }
}
  1. 成員變量 成員變量涉及到初始化的問題纯路,初始化方式有兩種,只能二選一:
  • 顯示初始化寞忿;
public class User { 
    final String USERNAME = "張三"; 
    private int age;
}
  • 構(gòu)造方法初始化驰唬。
public class User { 
    final String USERNAME ; private int age;
    public User(String username, int age) { 
        this.USERNAME = username;         
        this.age = age;
    }
}

被final修飾的常量名稱,一般都有書寫規(guī)范腔彰,所有字母都大寫叫编。

第二章 權限修飾符


2.1 概述


在Java中提供了四種訪問權限,使用不同的訪問權限修飾符修飾時霹抛,被修飾的內(nèi)容會有不同的訪問權限,

  • public:公共的搓逾。
  • protected:受保護的
  • default:默認的
  • private:私有的

2.2 不同權限的訪問能力


- public protected default(空的) private
同一類中
同一包中(子類與無關類) -
不同包的子類 - -
不同包的子類 - - -

可見,public具有最大權限杯拐。private則是最小權限霞篡。
編寫代碼時世蔗,如果沒有特殊的考慮,建議這樣使用權限:

  • 成員變量使用private ,隱藏細節(jié)朗兵。
  • 構(gòu)造方法使用public污淋,方便創(chuàng)建對象。
  • 成員方法使用public余掖,方便調(diào)用方法寸爆。

小貼士:不加權限修飾符,其訪問能力與default修飾符相同

第三章 內(nèi)部類


1.1 概述


什么是內(nèi)部類

將一個類A定義在另一個類B里面盐欺,里面的那個類A就稱為內(nèi)部類赁豆,B則稱為外部類
成員內(nèi)部類

  • 成員內(nèi)部類:定義在類中方法外的類冗美。
    定義格式:
class 外部類 {
    class 內(nèi)部類 {

    }
}

在描述事物時歌憨,若一個事物內(nèi)部還包含其他事物,就可以使用內(nèi)部類這種結(jié)構(gòu)墩衙。比如务嫡,汽車類Car中包含發(fā)動機類Engine ,這時漆改,Engine就可以使用內(nèi)部類來描述心铃,定義在成員位置。
代碼舉例:

class Car { //外部類
    class Engine { 
        //內(nèi)部類
    }
}
訪問特點
  • 內(nèi)部類可以直接訪問外部類的成員挫剑,包括私有成員去扣。
  • 外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象樊破。
    創(chuàng)建內(nèi)部類對象格式:
外部類名.內(nèi)部類名 對象名 = new 外部類型().new內(nèi)部類型();

訪問演示愉棱,代碼如下:
定義類:

public class Person {
    private boolean live = true;
    class Heart {
        public void jump() {
            // 直接訪問夕部類成員
            if (live) {
                System.out.println(" 心臟在跳動 ");
            } else { 
                System.out.println(" 心臟不跳了 ");
            }
        }
    }
    public boolean isLive() {
        return live;
    }
    public void setLive(boolean live) { 
        this.live = live;
    }
}

定義測試類:

public class InnerDemo {?
    public static void main(String[] args) {
        // 創(chuàng)建外部類對象 
        Person p = new Person();
        // 創(chuàng)建內(nèi)部類對象
        Heart heart = p.new Heart();
        // 調(diào)用內(nèi)部類方法 
        heart.jump();
        // 調(diào)用外部類方法 
        p.setLive(false);
        // 調(diào)用內(nèi)部類方法 
        heart.jump();
    }
}
輸出結(jié)果:
心臟在跳動
心臟不跳了

內(nèi)部類仍然是一個獨立的類,在編譯之后會內(nèi)部類會被編譯成獨立的.class文件哲戚,但是前面冠以外部類的類名 和$符號 奔滑。

比如, Person$Heart.class

1.2 匿名內(nèi)部類【重點】


  • 匿名內(nèi)部類:是內(nèi)部類的簡化寫法顺少。它的本質(zhì)是一個帶具體實現(xiàn)的父類或者父接口的 匿名的子類對象朋其。

開發(fā)中,最常用到的內(nèi)部類就是匿名內(nèi)部類了脆炎。以接口舉例梅猿,當你使用一個接口時,似乎得做如下幾步操作秒裕,

  1. 定義子類
  2. 重寫接口中的方法
  3. 創(chuàng)建子類對象
  4. 調(diào)用重寫后的方法

我們的目的袱蚓,最終只是為了調(diào)用方法,那么能不能簡化一下几蜻,把以上四步合成一步呢喇潘?匿名內(nèi)部類就是做這樣的快 捷方式体斩。

前提

匿名內(nèi)部類必須繼承一個父類或者實現(xiàn)一個父接口

格式
new 父類名或者接口名(){ 
    // 方法重寫 
    @Override
    public void method() { 
        // 執(zhí)行語句
    }
};
使用方式

以接口為例响蓉,匿名內(nèi)部類的使用硕勿,代碼如下: 定義接口:

public abstract class FlyAble{ 
    public abstract void fly();
}

創(chuàng)建匿名內(nèi)部類,并調(diào)用:

public class InnerDemo {
public static void main(String[] args) {
/*
1.  等號右邊:是匿名內(nèi)部類枫甲,定義并創(chuàng)建該接口的子類對象
2.  等號左邊:是多態(tài)賦值,接口類型引用指向子類對象
*/
FlyAble f = new FlyAble(){
public void fly() {
Sys tem.out. println(“我飛了 ");
}
};
//調(diào)用fly方法源武,執(zhí)行重寫后的方法 f.fly();
}
}

通常在方法的形式參數(shù)是接口或者抽象類時,也可以將匿名內(nèi)部類作為參數(shù)傳遞想幻。代碼如下

public class InnerDemo2 {
    public static void main(String[] args) {
        /*
        1.等號右邊:定義并創(chuàng)建該接口的子類對象
        2.等號左邊:是多態(tài), 接口類型引用指向子類對象
    */
        FlyAble f = new FlyAble(){     
            public void fly() {
            System.out.println("我飛了 ");
            }
        };
        //將f傳遞給showFly方法中
        showFly(f);
    }
    public static void showFly(FlyAble f) {
        f.fly();
    }
}

以上兩步粱栖,也可以簡化為一步,代碼如下:

public class InnerDemo3 {?
    public static void main(String[] args) {
        /*
        創(chuàng)建匿名內(nèi)咅B(yǎng)類,直接傳遞給showFly(FlyAble f)
        */
        showFly( new FlyAble(){ 
            public void fly() {
                System.out.println("我飛了~~~");
            }
        });
    }
    public static void showFly(FlyAble f) { 
        f.fly();
    }
}

第四章 引用類型用法總結(jié)


實際的開發(fā)中脏毯,引用類型的使用非常重要闹究,也是非常普遍的。我們可以在理解基本類型的使用方式基礎上食店,進一步去掌握引用類型的使用方式渣淤。基本類型可以作為成員變量吉嫩、作為方法的參數(shù)价认、作為方法的返回值,那么當然引用類型也是可以的自娩。

4.1 class作為成員變量


在定義一個類Role (游戲角色)時用踩,代碼如下:

class Role {
    int id; // 角色id
    int blood; // 生命值
    String name; // 角色名稱
}

使用int類型表示角色id和生命值,使用String類型表示姓名忙迁。此時脐彩,String本身就是引用類型,由于使用的方式類似常量姊扔,所以往往忽略了它是引用類型的存在惠奸。如果我們繼續(xù)豐富這個類的定義,給Role增加武器旱眯,穿戴裝備等屬性晨川,我們將如何編寫呢?
定義武器類删豺,將增加攻擊能力:

class Weapon {
    String name; // 武器名稱
    int hurt愧怜; // 傷害值
}

定義穿戴盔甲類呀页,將增加防御能力,也就是提升生命值:

class Armour {
    String name拥坛;// 裝備名稱
    int protect蓬蝶;// 防御值
}?

定義角色類:

class Role { 
    int id 尘分; 
    int blood ; 
    String name 丸氛; 
    // 添加武器屬性 
    Weapon wp 培愁; 
    // 添加盔甲屬性 
    Armour ar ;

    // 提供 get/set 方法 
    public Weapon getWp() { 
        return wp;
    }
    public void setWeapon(Weapon wp) { 
        this.wp = wp;
    }
    public Armour getArmour() {     
        return ar;
    }
    public void setArmour(Armour ar) { 
        this.ar = ar;
    }

    // 攻擊方法
    public void attack(){
        System.out.prin tln("使用"+ wp.getName() +", 造成 "+wp.ge tHurt()+"點傷害")缓窜; }

    // 穿戴盔甲
    public void wear(){
        //增加防御,就是增加blood值     
        this.blood += ar.getProtect()定续;     
        System.out.println("穿上"+ar.getName()+",生命值增加"+ar.getProtect());
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        //創(chuàng)建Weapon對象
        Weapon wp = new Weapon("屠龍刀",999999);
        //創(chuàng)建Armour對象
        Armour ar = new Armour("麒麟甲",10000);
        //創(chuàng)建Role對象 Role r = new Role();

        // 設置武器屬性
        r.setWeapon(wp);

        // 設置盔甲屬性?
        r.setArmour(ar);

        // 攻擊
        r.attack();
        // 穿戴盔甲
        r.wear();
    }
}
輸出結(jié)果:
使用屠龍刀,造成999999點傷害
穿上麒麟甲 ,生命值增加10000

類作為成員變量時禾锤,對它進行賦值的操作私股,實際上,是賦給它該類的一個對象恩掷。

4.2 interface作為成員變量


接口是對方法的封裝倡鲸,對應游戲當中,可以看作是擴展游戲角色的技能黄娘。所以峭状,如果想擴展更強大技能,我們在 Role 中,可以增加接口作為成員變量逼争,來設置不同的技能优床。
定義接口:

// 法術攻擊
public interface FaShuSkill {
    public abstract void faShuAttack();
}

定義角色類:

public class Role { 
    FaShuSkill fs;
    public void setFaShuSkill(FaShuSkill fs) { 
        this.fs = fs;
    }
    // 法術攻擊
    public void faShuSkillAttack(){
        System.out.print("發(fā)動法術攻擊:"); 
        fs.faShuAttack();
        System.out.println("攻擊完畢");
    }
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 創(chuàng)建游戲角色
        Role role = new Role();
        // 設置角色法術技能
        role.setFaShuSkill(new FaShuSkill() {
        @Override?
        public void faShuAttack() {
            System.out.prin tln("縱橫天下"); 
        }
    });

    // 發(fā)動法術攻擊
    role?faShuSkillAttack();

    // 更換技能
    role.setFaShuSkill(new FaShuSkill() { 
        @Override
        public void faShuAttack() {
            System.out.println ("逆轉(zhuǎn)乾坤");
        }
    });
    // 發(fā)動法術攻擊
    role.faShuSkillAttack();
    }
}
輸出結(jié)果: 
發(fā)動法術攻擊:縱橫天下 
攻擊完畢

發(fā)動法術攻擊:逆轉(zhuǎn)乾坤
攻擊完畢

我們使用一個接口,作為成員變量氮凝,以便隨時更換技能羔巢,這樣的設計更為靈活,增強了程序的擴展性罩阵。
接口作為成員變量時竿秆,對它進行賦值的操作,實際上稿壁,是賦給它該接口的一個子類對象幽钢。

4.3 interface作為方法參數(shù)和返回值類型


當接口作為方法的參數(shù)時,需要傳遞什么呢?當接口作為方法的返回值類型時傅是,需要返回什么呢匪燕?對,其實都是它的 子類對象喧笔。ArrayList類我們并不陌生帽驯,查看API我們發(fā)現(xiàn),實際上书闸,它是java.util.List接口的實現(xiàn)類尼变。所 以,當我們看見List接口作為參數(shù)或者返回值類型時,當然可以將ArrayList的對象進行傳遞或返回浆劲。
請觀察如下方法: 獲取某集合中所有的偶數(shù)嫌术。
定義方法:

public static List<Integer> getEvenNum(List<Integer> list) {
    // 創(chuàng)建保存偶數(shù)的集合
    ArrayList<Integer> evenList = new ArrayList<>();
    //遍歷集合lis t,判斷元素為偶數(shù)哀澈,就添加到evenList中 
    for (int i = 0; i < list.size(); i++) {
        Integer integer = list.get(i);
        if (integer % 2 == 0) {
            evenList.add(integer);
        }
    }
    /*
      返回偶數(shù)集合 
      因為getEvenNum方法的返回值類型是List,而ArrayList是List的子類,
      所以evenLis t可以返回
    */
    return evenList;
}

調(diào)用方法:

public class Test {
    public static void main(String[] args) { 
        //創(chuàng)建ArrayLis t集合,并添加數(shù)字 
        ArrayList<Integer> srcList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {       
            srcList.add(i);
        }
        /* 獲取偶數(shù)集合 
          因為getEvenNum方法的參數(shù)是List,而ArrayList是List的子類度气, 
          所以s rcLis t可以傳遞
        */
        List list = getEvenNum(srcList);     
        System.out.println(list);
    }
}

接口作為參數(shù)時割按,傳遞它的子類對象。
接口作為返回值類型時磷籍,返回它的子類對象适荣。

第五章綜合案例一一發(fā)紅包【界面版】


紅包文化源遠流長。從古時的紅色紙包择示,到手機App中的手氣紅包束凑,紅包作為一種獨特的中華文化傳承至今。之前的課程中栅盲,我們也編寫過程序汪诉,模擬發(fā)普通紅包。那么今天谈秫,我們將整合基礎班課程中所有的技術和知識扒寄,編寫一 個帶界面版的發(fā)紅包案例。

目前拟烫,我們尚未學習過任何與界面相關的類该编。所以,界面相關代碼硕淑,已經(jīng)給出课竣。請運用所學技術分析并使用。

案例需求

分析并使用已給出的類置媳,編寫程序于樟,設置紅包類型。

小貼士
紅包類型:

  1. 普通紅包:金額均分拇囊。不能整除的迂曲,余額添加到最后一份紅包中。
  2. 手氣紅包:金額隨機寥袭。各個紅包金額累和與總金額相等路捧。
    紅包場景:?
    此案例是模擬群主給群成員發(fā)紅包,群主自己打開最后一個紅包的場景传黄。
案例分析

已知的類:

  1. RedPacketFrame: —個抽象類杰扫,包含了一些屬性,是紅包案例的頁面膘掰。
public abstract class RedPacketFrame extends JFrame {
    /* ownerName : 群主名稱 */
    public String ownerName = "誰誰誰誰";
    /* openMode : 紅包的類型 [普通紅包/手氣紅包] */
    public OpenMode openMode = null;
    /**
    *   構(gòu)造方法: 生成紅包界面 .
    *   @param title 頁面的標題 .
    */
    public RedPacketFrame(String title) { 
        super(title);
        init();// 頁面相關的初始化操作
    }
/* set 方法 */
    public void setOwnerName(String ownerName) { 
        this.ownerName = ownerName;
    }
    public void setOpenMode(OpenMode openMode) { 
        this.openMode = openMode;
    }
}
  1. OpenMode : 一個接口涉波,包含一個分配方法,用來指定紅包類型炭序。
public interface OpenMode {
    /**
    *   @param totalMoney   總金額,單位是"分"啤覆。總金額為方便計算,已經(jīng)轉(zhuǎn)換為整數(shù),單位為分
    *   @param count    紅包個數(shù)
    *   @return ArrayList<Integer>  元素為各個紅包的金額值,所有元素的值累和等于總金額.
    *
    *請將to talMoney,分成coun t分惭聂,保存到ArrayLis t<In teger>中窗声,返回即可.
    */
    public abstract ArrayList<Integer> divide(int totalMoney, int count);
}
案例實現(xiàn)

環(huán)境搭建:

  1. 創(chuàng)建項目:名稱自定義,建議為RedPacketDemo辜纲。
  2. 導入圖片:將pic目錄笨觅,導入項目中,與src目錄平級耕腾。
  3. 導入已知類:在src下創(chuàng)建一個包见剩,名字自定義,建議為known 扫俺,將類RedPacketFrame苍苞、接口 OpenMode 拷入。
    代碼實現(xiàn):
  1. 定義RedPacket類狼纬,繼承 RedPacketFrame ,代碼如下:
    public class RedPacket extends RedPacketFrame { public RedPacket(String title) { super(title);
    }
    }
  2. 定義測試類羹呵,創(chuàng)建 RedPacket 對象,代碼如下:
public class RedPacketTest {
    public static void main(String[] args) {       
        RedPacket rp = new RedPacke t("大紅包")疗琉;
    }
}

運行代碼冈欢,打開一個發(fā)紅包的頁面∮颍可以輸入總金額凑耻,紅包個數(shù),留言信息柠贤。

點擊塞錢進紅包按鈕香浩,M弊專到下一頁面。

點擊誰誰誰誰种吸,兩個區(qū)域弃衍,發(fā)現(xiàn)可以設置兩項內(nèi)容:

  • 誰誰誰誰:表示群主在發(fā)紅包,可設置群主名稱坚俗。通過此方法镜盯,熟悉類結(jié)構(gòu),直接調(diào)用父類的方法猖败。
  • :表示打開紅包速缆,M弊專到下一頁面。但是開啟之前恩闻,必須先設置紅包的類型艺糜,否則無法開啟。?
    諸通過[setOpenMode]方法設置紅包類型
  1. RedPacket 對象,設置群主名稱破停。
    setOwnerName (String ownerName),是字符串作為參數(shù)翅楼。我們只需要傳遞一個字符串即可。
public class RedPacketTest { 
      public static void main(String[] args) { 
      // 創(chuàng)建紅包對象
      RedPacket rp = new RedPacke t("大紅包")真慢;
      // 設置群主名稱
      rp. setO wnerName ("我是群大大");
    }
}
  1. RedPacket 對象毅臊,設置紅包類型。
    setOpenMode(OpenMode openMode)黑界,是接口作為參數(shù)管嬉。我們必須定義接口的實現(xiàn)類,重寫接口中方法蚯撩,并傳 遞實現(xiàn)類對象到setOpenMode方法中胎挎,方可設置完成弦赖。再觀察接口:
public interface OpenMode {
    /**
    *   @param totalMoney   總金額,單位是"分"沼沈。總金額為方便計算,已經(jīng)轉(zhuǎn)換為整數(shù),單位為分
    *   @param count    紅包個數(shù)
    *   @return ArrayList<Integer>  元素為各個紅包的金額值,所有元素的值累和等于總金額.
    *
    * 請將 totalMoney, 分成 count 分 , 保存到 ArrayList<Integer> 中 , 返回即可 .
    */
    public abstract ArrayList<Integer> divide(int totalMoney, int count);
}
  1. 普通紅包,打開方式 Common , 代碼如下:
public class Common implements OpenMode {
    @Override
    public ArrayList<Integer> divide(int totalMoney, int count) {
        // 創(chuàng)建保存各個紅包金額的集合
        ArrayList<Integer> list = new ArrayList<>();
        //定義循環(huán)次數(shù),總個數(shù)-1次
        int time = count - 1;
        // 一次計算,生成平均金額
        int money = totalMoney / count;
        // 循環(huán)分配
        for (int i = 0; i < time; i++) {
            // 添加到集合中
            list.add(money);

            // 總金額扣除已分配金額 
            totalMoney -= money;
        }
        // 剩余的金額, 為最后一個紅包     
        list.add(totalMoney);
        System.out.println("普通紅包金額:"+ lis t);
        // 返回集合
        return list;
    }
}
  1. 發(fā)普通紅包,代碼如下:
public class RedPacketTest { 
    public static void main(String[] args) {
        // 創(chuàng)建紅包對象
        RedPacket rp = new RedPacke t("大紅包");
        // 設置群主名稱
        rp. set OwnerName ("我是群大大");
        // 設置紅包類型 
        rp?setOpenMode(new Common()); // 普通紅包
    }
}
  1. 手氣紅包【重點】
    本質(zhì)上,手氣紅包就是把總金額totalMoney隨機分成指定的count份页响,所以必須規(guī)定每一份金額的取值范圍。如 果范圍太小,可能導致后分配紅包金額特別大染簇。反之范圍太大砾赔,可能導致后分配紅包金額為0,不夠分√醇校可見,取 值范圍的定義規(guī)則,是手氣紅包的關鍵所在吼畏。
    我們規(guī)定:每一份隨機金額范圍(除最后一份)旁仿,最小值為1毅贮,最大值為當前剩余平均金額的2倍 病蛉,單位為"分"酒甸。 計算公式:

當前剩余平均金額=剩余總金額/剩余紅包個數(shù)

舉例:總額為50元,發(fā)5個紅包。

- 當前剩余平均金額(取整數(shù)) 紅包范圍 隨機金額(假設)
第一個紅包 50 / 5 = 10 0.01~20 5
第二個紅包 45 / 4= 11 0.01~22 20
第三個紅包 25 / 3. = 8 0.01~16 10
第四個紅包 15 / 2 = 7 0.01~14 12
第五個紅包(最后一個) 無需計算 剩余金額 3

小貼士:為方便表格中進行運算,此處,單位為"元"。程序中,建議換算為"分"進行運算。

手氣紅包玄组,打開方式 Lucky , 代碼如下:?

public class Lucky implements OpenMode {
    @Override
    public ArrayList<Integer> divide(int totalMoney, int count) { // 創(chuàng)建保存各個紅包金額的集合
    ArrayList<Integer> list = new ArrayList<>();
    //定義循環(huán)次數(shù),總個數(shù)-1次
    int time = count - 1;
    // 創(chuàng)建隨機數(shù)對象
    Random random = new Random();
    // 循環(huán)分配
    for (int i = 0; i < time; i++) {
        /*
        *   每次重新計算 , 生成隨機金額
        *   隨機范圍:tot alMoney / count * 2, tot alMoney 不斷的減少,
        *   coun t也不斷的減少哆致,所以這是一個可變化的范圍.
        */
        int money = random.nextInt(totalMoney / count * 2) + 1;
        // 金額添加到集合
        list.add(money);
        // 總金額扣除已分配金額
        totalMoney -= money;
        // 紅包個數(shù)-1
        count--;
    }
    // 剩余的金額,為最后一個紅包
    list.add(totalMoney);
    return list;
  }
}
  1. 發(fā)手氣紅包绕德,代碼如下:
public class RedPacketTest { 
    public static void main(String[] args) {
        // 創(chuàng)建紅包對象
        RedPacket rp = new RedPacket("大紅包");
        // 設置群主名稱
        rp.setOwnerName ("我是群大大");
        // 設置紅包類型,二選一
        // rp.setOpenMode(new Common()); // 普通紅包     
        rp.setOpenMode(new Lucky()); // 手氣紅包
    }
}

案例總結(jié)
通過 發(fā)紅包 案例摊阀,你都學到了什么呢耻蛇?請你思考如下問題:

  1. 基礎語法,你是否清晰胞此?
  2. 一些基本的類的方法臣咖,你是否能夠調(diào)用?
  3. 案例中哪里體現(xiàn)了繼承豌鹤,繼承的作用是什么亡哄?
  4. 接口作為參數(shù),如何使用布疙?
  5. 接口作為成員變量,如何使用愿卸?
  6. 如何簡化接口的使用方式灵临? 相信每位學員,都會有自己的思考和答案趴荸。也相信大家儒溉,隨著開發(fā)經(jīng)驗的豐富,對于技術的理解會更加深入发钝,對技 術的運用會更加純熟顿涣。通過對大量案例的不斷積累,最終寫出屬于你自己的程序酝豪,成為一名真正的coder涛碑。
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市孵淘,隨后出現(xiàn)的幾起案子蒲障,更是在濱河造成了極大的恐慌,老刑警劉巖瘫证,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揉阎,死亡現(xiàn)場離奇詭異,居然都是意外死亡背捌,警方通過查閱死者的電腦和手機毙籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡庆,“玉大人坑赡,你說我怎么就攤上這事烙如。” “怎么了垮衷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵厅翔,是天一觀的道長。 經(jīng)常有香客問我搀突,道長刀闷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任仰迁,我火速辦了婚禮甸昏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐许。我一直安慰自己施蜜,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布雌隅。 她就那樣靜靜地躺著翻默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恰起。 梳的紋絲不亂的頭發(fā)上修械,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音检盼,去河邊找鬼肯污。 笑死,一個胖子當著我的面吹牛吨枉,可吹牛的內(nèi)容都是我干的蹦渣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼貌亭,長吁一口氣:“原來是場噩夢啊……” “哼柬唯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起属提,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤权逗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冤议,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斟薇,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年恕酸,在試婚紗的時候發(fā)現(xiàn)自己被綠了堪滨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蕊温,死狀恐怖袱箱,靈堂內(nèi)的尸體忽然破棺而出遏乔,到底是詐尸還是另有隱情史辙,我是刑警寧澤场钉,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站兰伤,受9級特大地震影響了讨,放射性物質(zhì)發(fā)生泄漏捻激。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一前计、第九天 我趴在偏房一處隱蔽的房頂上張望胞谭。 院中可真熱鬧,春花似錦男杈、人聲如沸丈屹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旺垒。三九已至,卻和暖如春肤无,著一層夾襖步出監(jiān)牢的瞬間袖牙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工舅锄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人司忱。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓皇忿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坦仍。 傳聞我的和親對象是個殘疾皇子鳍烁,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345