教材學習內容總結java
第六章 繼承與多態ide
6.1 何爲繼承函數
0.面向對象中,子類繼承父類,避免城府的行爲定義。正確判斷使用繼承的時機,以及繼承以後如何活用多態,纔是學習繼承時的重點。學習
1.繼承:避免多個類間重複定義共同行爲。
繼承的好處:將name、level、blood改成其它名稱,只要修改Role.java就能夠了,只要繼承Role的子類都無需修改。ui
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.pringtf(「劍士:(%s, %d, %d)%n」, swordsMan.getName(), swordMan.getLevel(), swordsMan.getBlood()); } static void demoMagician() { Magician magician = new Magician(); magician.setName("Monica"); magician.getLevel(1); magician.getBlood(100); System.out.printf(「魔法師:(&s, &d, &d)%n」, magician.getName(), magician.getLevel(), magician.getBlood()); }
}
執行結果:
劍士:(Justin,1,200)
魔法師:(Monica,1,100)code
2.多態與is-a
在java中,子類只能繼承一個父類。
is-a:繼承除了可避免類間重複的行爲定義類外,還有一種重要的關係——is-a,中文稱爲「是一種」的關係。
多態:抽象的說,就是使用單一接口操做多種類型的對象。對象
public class RPG {
public static void main(String[] args)
{
SwordsMan swordsMan = new SwordsMan();
swordsMan.setName("Justin");
swordsMan.setLevel(1);
swordsMan.setBlood(200);繼承
Magician magician = new Magician(); magician.setName("Monica"); magician.getLevel(1); magician.getBlood(100); showBlood(swordsMan); showBlood(magician); } static void showBlood(Role role) { System.out.printf("%s 血量 %d%n",role.getName(), role.getBlood()); }
}
執行結果:
Justin 血量 200
Magica 血量 100接口
3.從新定義行爲
再從新定義父類中的某個方法時,子類必須編寫與父類方法中相同的簽署。
再從新定義某種方法時,加上@override,就不用擔憂打錯字的問題了。
public class RPG {
public static void main(String[] args)
{
SwordsMan swordsMan = new SwordsMan();
swordsMan.setName("Justin");
swordsMan.setLevel(1);
swordsMan.setBlood(200);
Magician magician = new Magician(); magician.setName("Monica"); magician.getLevel(1); magician.getBlood(100); drawFight(swordsMan); drawFight(magician); } static void showBlood(Role role) { System.out.printf(role.getName()); role.fight(); }
}
執行結果:
Justin揮劍攻擊
Monica魔法攻擊
4.抽象方法、抽象類
java中規定內涵抽象方法的類,必定要在class前標示abstract,表示一個定義不完整的抽象類。(若是嘗試用抽象類建立實例,就會引起編譯錯誤)
子類若繼承抽象類,對於抽象方法有兩種作法:
·繼續標示該方法爲abstract(該子類所以也是個抽象類,必須在class前標示abstract);
·操做抽象方法。
(兩種抽象方法都沒有實施,就會引起編譯錯誤)
6.2 繼承語法繼承
1.protected成員
被聲明爲protected成員,相同包中的類能夠直接存取,不一樣包中的類能夠本身城中的子類直接存取。
java中的權限關鍵字:public、protected、private。(實際上有4個權限範圍,由於沒有定義權限關鍵字,默認就是是包範圍)
2.從新定義的細節
對於父類中的方法權限,只能擴大不能縮小。
在JDK5以前,從新定義方法時除了能夠定義權限較大的關鍵字外,其餘部分必須與父類中方法簽署徹底一致。
在JDK5以後,從新定義方法類時,若是返回類型是父類中方法返回類型的子類,也是能夠經過編譯的。
3.java.lang.Object
若是定義類時沒有使用extends關鍵字指定繼承任何類,那必定是繼承java.lang.Object。
所以在java中,任何類追溯至最上層必定就是java.lang.Object,也就是說,在java中全部對象,必定「是一種」Object。
任何類型的對象,均可以使用Object申明的名稱來參考。
import java.util.Scanner;
import static java.lang.System.out;
public class Guess
{
public static void main(String[] args)
{
ArrayList names = new ArrayList();
collectNameTo(names);
out.printIn(「訪客名單:」);
printUpperCase(names);
}
static void collectNameTo(ArrayList names)
{
Scanner console = new Scanner(System.in);
while(true)
{
out.print(「訪客名稱:」);
String names = console.nextLine();
if(name.equals("quit"))
{
break;
}
names.add(name);
}
}
static void printUpperCase(ArrayList names) { for(int i = 0; i < names.size(); i++) { String name = (String) names.get(i); out.printIn(name.toUpperCase()); } }
}
執行結果:
訪客名稱:Justin
訪客名稱:Monica
訪客名稱:Irene
訪客名稱:quit
訪客名單:
JUSTIN
MONICA
IRENE
4.關於垃圾收集
建立對象會佔據內存,若是程序執行流程中已經沒法再使用某個對象,該對象只是徒耗內存的萊基。
對於再也不使用的對象,JVM有垃圾收集機制(GC),收集到的垃圾對象所佔據的內存,會被垃圾收集器釋放。
5.再看抽象類
第七章 接口與多態
1.接口定義行爲
類要操做接口,必須使用implemente關鍵字。
2.行爲的多態
public class Ocean{
public static void main(String[] args)
{
doSwim(new Anemonefish("尼莫"));
doSwim(new Shark("蘭尼"));
doSwim(new Huamn("賈斯汀"));
doSwim(new Submarine("黃色一號"));
}
static void doSwim(Swimmer swimmer){ swimmer.swim(); }
}
執行結果:
小丑魚 尼莫 游泳
鯊魚 蘭尼 游泳
人類 賈斯汀 游泳
潛水艇 黃色一號 潛行
7.2 接口語法細節
1.接口的默認
在java中,可以使用interface來定義抽象行爲與外觀(如接口中的方法可聲明爲public abstract)。接口中的方法沒有操做時,必定得是公開且抽象。能夠省略public abstract,編譯程序會自動幫你加上public abstract。默認必定是public。
2.匿名內部類
在編寫java程序時,常常會有臨時繼承某個類或操做某個接口並創建實例的需求。因爲這類子類或接口操做類只使用一次,不須要爲這些類定義名稱,這時可使用匿名內部類(AIC)來解決這個需求。
new 父類()|接口(){
//類本體操做
};
使用匿名內部類,直接創建操做ClientListener的對象:
public class MultiChat{
public static void main(String[] args){
Client c1 = new Clent("127.0.0.1","Caterpillar");
Client c2 = new Clent("192.168.0.2","Justin");
ClientQueue queue = new ClientQueue(); queue.addClientListener(new ClientListener(){ @Override public void clientAdded(ClientEvent event){ System.out.printf("%s 從 %s 聯機%n", event.getName(), event.getIp()); } @Override public void clientRemoved(ClientEvent event){ System.out.printf("%s 從 %s 聯機%n", event.getName(), event.getIp()); } }); queue.add(c1); queue.add(c2); queue.remove(c1); queue.remove(c2); }
}
執行結果:
caterpillar 從 127.0.0.1 聯機
justin 從 192.168.0.2 聯機
caterpillar 從 127.0.0.1 聯機
justin 從 192.168.0.2 聯機
3.使用enum枚舉常數
從JDK5以後新增了enum語法,可用於定義枚舉常數。
例
public enum Action{
STOP, RIGHT, LEFT, UP, DOWN
}
範例中的enum定義的Action其實是個類,而enum中例舉的STOP, RIGHT, LEFT, UP, DOWN常數,其實是public static final,且爲Action實例。你沒法編寫程序直接實例化Action,由於構造函數權限設定爲private,只有Action類中才能夠實例化。
教材學習中的問題和解決過程
本週的學習內容和上週同樣太多,光是看書並不能都看懂弄會,而且只是本身敲代碼仍是有許多的不理解,這兩章的內容都有些抽象,因此許多地方都詢問了同窗。
代碼調試中的問題和解決過程
第六章兩個章節都有關於抽象方法、抽象類的內容,可是很難理解,光看書上的代碼並無搞懂。
其餘(感悟、思考等)
說實話大量時間放在java上,可是感受學習的效果並非很理想,看來我仍是得好好想一想學習方法是否哪裏不對。
參考資料
Java學習筆記(第8版) 《Java學習筆記(第8版)》學習指導