20145207 《Java程序设计》第4周学习总结
前言
又到了大家最喜歡的前言時(shí)間,哈哈哈。我這個(gè)人啊,就是比較愛閑聊。正式在學(xué)校呆的第一天時(shí)間就在這里敲代碼,自己都覺得自己偉大。不過好無聊呀....這周的內(nèi)容說實(shí)話講我還是挺感興趣的,因?yàn)闀系睦又v的游戲比較心動(dòng)。雖然就是簡單的屬性配置,但是一談到游戲就感覺好有干勁。這么說是不是不太好~不過是真的有干勁兒的嘞!起碼玩這么多的游戲,現(xiàn)在知道了它的屬性配置也是極好的。廢話不多說了,切入正題。
一.繼承與多態(tài)
1.繼承的定義
面對(duì)對(duì)象中,子類繼承父類,避免重復(fù)的行為定義,不過并非為了避免重復(fù)定義行為就使用繼承,濫用而繼承會(huì)導(dǎo)致程序維護(hù)上的問題。
程序代碼重復(fù)在程序設(shè)計(jì)上就是不好的信號(hào),多個(gè)類間出現(xiàn)重復(fù)的代碼時(shí),設(shè)計(jì)上可以考慮的改進(jìn)方式之一,就是把相同的程序提升為父類。
在java中,繼承時(shí)使用extends關(guān)鍵字,private成員也會(huì)被繼承,只不過子類無法直接存取,必須通過父類提供的方法來存取。
在Java中,子類只能繼承一個(gè)父類,繼承有個(gè)重要的關(guān)系,就是子類和父類之間會(huì)有is-a的關(guān)系,要開始理解多態(tài),必須先知道操作的對(duì)象是哪一類。
書上面劍士法師的這個(gè)代碼我還是很感興趣的,雖然別人都知道,但是還是分享一下吧。
第一個(gè)是可以運(yùn)行的RPG軟件。
package ch06;
?
public class RPG {
??? public static void main(String[] args) {
??????? demoSwordsMan();
?????? ?demoMagician();
??? }
??? static void demoSwordsMan(){
??????? SwordsMan swordsMan = new SwordsMan();
??????? swordsMan.setName("Justin");
??????? swordsMan.setLevel(1);
??????? swordsMan.setBlood(200);
??????? System.out.printf("劍士: (%s,%d,%d)%n",swordsMan.getName(),swordsMan.getLevel(),swordsMan.getBlood());
??? }
??? static void demoMagician(){
??????? Magician magician = new Magician();
??????? magician.setName("Monica");
??????? magician.setLevel(1);
??????? magician.setBlood(200);
?
??????? System.out.printf("魔法師: (%s,%d,%d)%n",magician.getName(),magician.getLevel(),magician.getBlood());
??? }
}
第二個(gè)這是被繼承的代碼。
package ch06;
?
public class Role {
??? private String name;
??? private int level;
??? private int blood;
??? public int getBlood(){
???? ???return blood;
??? }
??? public void setBlood(int blood){
?
??????? this.blood = blood;
??? }
??? public int getLevel(){
?
??????? return level;
??? }
??? public void setLevel(int level){
?
??????? this.level = level;
??? }
??? public String getName(){
?
?? ?????return name;
??? }
??? public void setName(String name){
?
??????? this.name = name;
??? }
}
這個(gè)是對(duì)于劍士的定義,通過繼承來實(shí)現(xiàn)。
package ch06;
?
public class SwordsMan extends Role {
??? public void fight(){
??????? System.out.println("揮劍攻擊");
??? }
}
這個(gè)是對(duì)于魔法師的定義,通過繼承來實(shí)現(xiàn)。
package ch06;
?
public class Magician extends Role {
??? public void fight(){
??????? System.out.println("魔法攻擊");
??? }
??? public void cure(){
??????? System.out.println("魔法治療");
??? }
}
雖然SwordsMan與Magician沒有定義getName()、getLevel()、與getBlood()等方法,但從Role繼承了這些方法,所以就如同例子中可以直接使用。
繼承的好處之一,就是若要將name、level、blood改為其他名稱,那就只要修改Role.java就可以了,只要是繼承Role的子類都無須修改。
最后的程序運(yùn)行結(jié)果:
雖然界面挺low的哈,看了后面的東西,再填進(jìn)去幾個(gè)界面也不是啥難事。好想做個(gè)游戲啊,要超厲害的那種。
2.多態(tài)與is-a
在Java中,子類只能繼承一個(gè)父類,繼承除了可避免的行為定義外,還有個(gè)重要的關(guān)系,那就是子類和父類之間會(huì)有is-a的關(guān)系。
編譯程序就是語法檢查器,要知道程序片段為何可以通過編譯,為何無法通過編譯,就是將自己當(dāng)做編譯程序,檢查語法邏輯是否正確,方式是從=號(hào)的右邊往左邊讀:右邊是不是左邊的一種。
什么是多態(tài)?以抽象講法解釋,就是使用單一的接口操作多種類型的對(duì)象。檢查多態(tài)語法邏輯是否正確,方式是從右邊往左讀:右邊是不是一種左邊呢?如果不是就會(huì)編譯失敗,如果加上扮演語法,編譯程序就會(huì)讓程序代碼通過編譯,不過后果自負(fù),也就是扮演失敗,執(zhí)行時(shí)會(huì)拋出ClassCastException。
3.重新定義
在繼承父類之后,定義與父類中相同的方法部署,但執(zhí)行內(nèi)容不同,這稱為重新定義。因?yàn)閷?duì)父類中已定義的方法執(zhí)行不滿意,所以在子類中重新定義執(zhí)行。
4.final關(guān)鍵字
如果class前使用了final關(guān)鍵字定義,那么表示這個(gè)類是最后一個(gè)了,不會(huì)再有子類,也就不能被繼承。定義方法時(shí),也可以是限定該方法為final,這表示最后一次定義方法了,也就是子類不可以重新定義final方法。
· 接口與多態(tài)
抽象類:java可以定義沒有方法體的方法,該方法的具體實(shí)現(xiàn)由子類完成,該方法稱為抽象方法,包含抽象方法的就是抽象類。抽象類和抽象方法必須用abstruct關(guān)鍵字來修飾。
interface:接口定義行為但不可定義操作。 接口中的成員修飾符是固定的。類與接口是實(shí)現(xiàn)關(guān)系,而且類可以繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口。
public interface Swimmer{public abstract void main swim(); }implements:類要操作接口,使用implements關(guān)鍵字,操作接口時(shí),對(duì)接口中定義的方法的兩種處理方式:1.操作接口中定義的方法,2.將該方法標(biāo)示為abstract
例如:
public abstract class Fish implements Swimmer { protected String name; public Fish(String name){ this.name = name; } public String getName(){ return name; }類與類之間存在著繼承關(guān)系,類與接口中間存在的是實(shí)現(xiàn)關(guān)系。繼承用extends,實(shí)現(xiàn)用implements
在interface接口中常常可以定義枚舉常數(shù)(例:public static final int),實(shí)際上,在interface接口中也只能定義public static final的枚舉常數(shù),并且一定要使用=指定值,否則就會(huì)編譯錯(cuò)誤。
抽象類與接口的區(qū)別 1:抽象類只能被繼承,而且只能單繼承。 接口需要被實(shí)現(xiàn),而且可以多實(shí)現(xiàn)。 2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。 接口中都有抽象方法,需要子類去實(shí)現(xiàn)。 3:抽象類使用的是 is a 關(guān)系。 接口使用的 like a 關(guān)系。 4:抽象類的成員修飾符可以自定義。 接口中的成員修飾符是固定的。全都是public的。
enum:enum語法可用于定義枚舉常數(shù),enum實(shí)際上定義了類,而enum中列舉的常數(shù)實(shí)際上是public static final,無法撰寫程序直接實(shí)例化枚舉類型,因?yàn)闃?gòu)造函數(shù)權(quán)限設(shè)定為private,只有類中才可以實(shí)例化。enum 可定義枚舉常數(shù),但實(shí)際上 enum 定義了特殊的類,繼承自 java.lang.Enum,編譯過后會(huì)產(chǎn)生 Action.class 文件,可用這個(gè) Action 聲明類型
public class Game {public static void main(String[] args){ play(Action.RIGHT); play(Action.UP); //只能傳入 Action 實(shí)例 } public static void play(Action action){ // action 參數(shù)聲明為 Action 類型,所以只接受 Action 的實(shí)例,這樣就不需要必須使用 default 檢查,編譯程序在編譯時(shí)期會(huì)進(jìn)行類型檢查 switch(action){ case STOP: out.println("播放停止動(dòng)畫"); break; case RIGHT: out.println("播放向右動(dòng)畫"); break; case LEFT: out.println("播放向左動(dòng)畫"); break; case UP: out.println("播放向上動(dòng)畫"); break; case DOWN: out.println("播放向下動(dòng)畫"); break; } } }教材學(xué)習(xí)中的問題和解決過程
剛開始學(xué)習(xí)繼承的時(shí)候敲第一個(gè)角色游戲代碼出現(xiàn)錯(cuò)誤,在繼承的時(shí)候,需要將完整的代碼都放在同一個(gè)文件夾下,書中有時(shí)候只是展現(xiàn)一部分代碼,但前面的角色定義還要敲上去,保證代碼的完整性,這樣子類才會(huì)繼承父類。 教材中的一些內(nèi)容講得十分詳盡,例如多態(tài)與is-a,翻來覆去講不同的語句可能出現(xiàn)的編譯失敗的情況及原因,這部分的學(xué)習(xí)也十分重要,關(guān)系到以后寫出來的東西有沒有彈性、好不好維護(hù)的問題;書中也有一些表述比較少,讓人看得不是很懂的地方,例如instanceof運(yùn)算符,Override等,只能通過視頻加以學(xué)習(xí)。現(xiàn)階段還停留在敲書上代碼的過程,希望自己能夠在接下來提出些更有價(jià)值的問題。
代碼調(diào)試中的問題和解決過程
interface Some {protected static final int x = 10; } public class Main { public static void main (String[] args){ System.out.println(Some.x); } }被聲明為protected的成員,相同包中的類可以直接存取,不同包中的類需要在繼承后的子類中存取。代碼中沒有繼承關(guān)系不同類,編譯失敗,刪去protected編譯通過結(jié)果為10
其他(感悟、思考等)
沒啥感悟了,明天實(shí)習(xí),找機(jī)會(huì)接著碼字,敲代碼。我愛學(xué)習(xí),學(xué)習(xí)使我快樂。哈哈哈哈哈哈哈。明早升旗。世界晚安。
轉(zhuǎn)載于:https://www.cnblogs.com/20145207lza/p/5816252.html
總結(jié)
以上是生活随笔為你收集整理的20145207 《Java程序设计》第4周学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Oracle执行计划解释
- 下一篇: js 中导出excel 较长数字串会变成