第一章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 Math、public final class Scanner 等寸五,很多我們學習過的類梳凛,都是被final修飾的,目的就是供我們使用梳杏,而不讓我們所以改變其內(nèi)容韧拒。
修飾方法
格式如下:
修飾符 final 返回值類型 方法名(參數(shù)列表){
// 方法體
}
重寫被final修飾的方法淹接,編譯時就會報錯。
修飾變量
-
局部變量——基本類型
基本類型的局部變量叛溢,被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。這也是大家需要注意的地方诫钓。
-
局部變量——引用類型
引用類型的局部變量旬昭,被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(" 張三 "); // 可以修改
}
}
- 成員變量 成員變量涉及到初始化的問題纯路,初始化方式有兩種,只能二選一:
- 顯示初始化寞忿;
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)部類了脆炎。以接口舉例梅猿,當你使用一個接口時,似乎得做如下幾步操作秒裕,
- 定義子類
- 重寫接口中的方法
- 創(chuàng)建子類對象
- 調(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)給出课竣。請運用所學技術分析并使用。
案例需求
分析并使用已給出的類置媳,編寫程序于樟,設置紅包類型。
小貼士
紅包類型:
- 普通紅包:金額均分拇囊。不能整除的迂曲,余額添加到最后一份紅包中。
- 手氣紅包:金額隨機寥袭。各個紅包金額累和與總金額相等路捧。
紅包場景:?
此案例是模擬群主給群成員發(fā)紅包,群主自己打開最后一個紅包的場景传黄。
案例分析
已知的類:
- 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;
}
}
- 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)境搭建:
- 創(chuàng)建項目:名稱自定義,建議為RedPacketDemo辜纲。
- 導入圖片:將pic目錄笨觅,導入項目中,與src目錄平級耕腾。
- 導入已知類:在src下創(chuàng)建一個包见剩,名字自定義,建議為known 扫俺,將類RedPacketFrame苍苞、接口 OpenMode 拷入。
代碼實現(xiàn):
- 定義RedPacket類狼纬,繼承 RedPacketFrame ,代碼如下:
public class RedPacket extends RedPacketFrame { public RedPacket(String title) { super(title);
}
} - 定義測試類羹呵,創(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]方法設置紅包類型
-
RedPacket 對象,設置群主名稱破停。
setOwnerName (String ownerName),是字符串作為參數(shù)翅楼。我們只需要傳遞一個字符串即可。
public class RedPacketTest {
public static void main(String[] args) {
// 創(chuàng)建紅包對象
RedPacket rp = new RedPacke t("大紅包")真慢;
// 設置群主名稱
rp. setO wnerName ("我是群大大");
}
}
-
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);
}
- 普通紅包,打開方式 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;
}
}
- 發(fā)普通紅包,代碼如下:
public class RedPacketTest {
public static void main(String[] args) {
// 創(chuàng)建紅包對象
RedPacket rp = new RedPacke t("大紅包");
// 設置群主名稱
rp. set OwnerName ("我是群大大");
// 設置紅包類型
rp?setOpenMode(new Common()); // 普通紅包
}
}
- 手氣紅包【重點】
本質(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;
}
}
- 發(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ā)紅包 案例摊阀,你都學到了什么呢耻蛇?請你思考如下問題:
- 基礎語法,你是否清晰胞此?
- 一些基本的類的方法臣咖,你是否能夠調(diào)用?
- 案例中哪里體現(xiàn)了繼承豌鹤,繼承的作用是什么亡哄?
- 接口作為參數(shù),如何使用布疙?
- 接口作為成員變量,如何使用愿卸?
- 如何簡化接口的使用方式灵临? 相信每位學員,都會有自己的思考和答案趴荸。也相信大家儒溉,隨著開發(fā)經(jīng)驗的豐富,對于技術的理解會更加深入发钝,對技 術的運用會更加純熟顿涣。通過對大量案例的不斷積累,最終寫出屬于你自己的程序酝豪,成為一名真正的coder涛碑。