20145231第四周学习笔记
20145231 《Java程序設(shè)計》第4周學(xué)習(xí)總結(jié)
教材學(xué)習(xí)內(nèi)容總結(jié)
基本概念:
?何謂繼承
繼承:面向?qū)ο笾?#xff0c;子類繼承父類,避免重復(fù)定義的共同行為;
extends關(guān)鍵字:在繼承父類的程序代碼基礎(chǔ)上,補(bǔ)充定義新的程序代碼,擴(kuò)充其原本沒有的行為;
繼承的好處:避免重復(fù)的同時,若是要對相應(yīng)的數(shù)據(jù)成員名稱做修改,只需要在父類中修改即可;
?多態(tài)與is-a
is-a關(guān)系:子類只能繼承一個父類,即子類“是一種”父類,可用來判斷如下代碼片段:
Role role1 = new Swordsman(); Swordsman swordsman = new Role();用is-a關(guān)系判斷是否能編譯通過即右邊類是不是左邊類的子類;
多態(tài):使用單一接口操作多種類型對象,不需要用重載的方式寫很多個方法,具有更高的維護(hù)性;
?重新定義行為
重新定義:在繼承父類之后,定義與父類中相同的方法部署,但執(zhí)行內(nèi)容不同;在重新定義父類中某個方法時,子類必須撰寫與父類方法中相同的簽署;
?抽象方法抽象類
abstract關(guān)鍵字:在某方法區(qū)塊中沒有任何程序代碼操作時,使用abstract標(biāo)示該方法為抽象方法(該方法不用撰寫{}區(qū)塊,直接;結(jié)束即可);
帶有abstract關(guān)鍵字的類為定義不完整的抽象類,不能創(chuàng)建實例;
繼承抽象類:1、繼續(xù)標(biāo)示該方法為abstract;2、操作抽象方法;否則編譯報錯;
?繼承語法細(xì)節(jié)
protected成員:被聲明為protected的成員,相同包中的類可以直接存取,不同包中的類可以在繼承后的子類直接存取;
重新定義的細(xì)節(jié):重新定義方法時,若只是希望在父類中方法前后做點加工,可在父類中直接添加,想取得父類中的方法定義,只需在調(diào)用前加上super關(guān)鍵字;(使用super關(guān)鍵字調(diào)用的父類方法不能定義為private,同時,重新定義方法時,對于父類中的方法權(quán)限只能擴(kuò)大不能縮小)
JDK5之后,如果返回類型是父類中方法返回類型的子類,可通過編譯;
構(gòu)造函數(shù):如果子類構(gòu)造函數(shù)中沒有指定調(diào)用父類中那個構(gòu)造函數(shù),默認(rèn)會調(diào)用父類中無參數(shù)構(gòu)造函數(shù);
final關(guān)鍵字:class前使用final,表示這是最后一個類不會再有子類;定義方法為final表示最后一次定義方法;
java.lang.Object:定義類時若沒有extends關(guān)鍵字,那一定是繼承java.lang.Object;(頂層父類,Object上定義的方法所有對象都繼承下來了,只要沒有定義為final,都可以重新定義)
tostring()、equals()都是Object類定義的方法,返回值類型分別為字符串型和布爾型;
instanceof運(yùn)算符:判斷對象是否由某個類創(chuàng)建,左操作數(shù)是對象,右操作數(shù)是類,只要左操作數(shù)是右操作數(shù)的子類型,返回結(jié)果就為true;
垃圾收集:程序執(zhí)行流程中無法再使用某個對象,該對象就是徒耗內(nèi)存的垃圾,就會被回收;
?何謂接口
接口:可用于定義行為但不操作(表示擁有行為,是多重繼承的一種方式),類要操作接口,就必須有implements關(guān)鍵字(為了生成與特定接口相符合的類);
接口中定義的方法的處理方式:操作接口中定義的方法、再度將其標(biāo)示為abstract;
?接口的語法細(xì)節(jié)
接口的默認(rèn):接口中的方法沒有操作時,一定得是公開且抽象(interface關(guān)鍵字:定義抽象行為與外觀);
枚舉常數(shù):為了在維護(hù)程序時使程序清晰;
匿名內(nèi)部類:對于只使用一次的繼承某個類的子類或接口操作類,不需為這些類定義名稱;
教材學(xué)習(xí)中的問題和解決過程
問題一:private成員不能被繼承?
解決過程:private成員會被繼承,只不過子類無法直接存取,必須通過父類提出的訪問方法來存取;
問題二:如何判斷一段程序是否是合法的多態(tài)語法?
Swimmer swimmer = new Shark(); Swimmer swimmer = new Human(); Swimmer swimmer = new Submarine();\\編譯通過解決過程:判斷右邊是否擁有左邊的行為,即右邊對象是否操作了左邊接口;
Shark shark = swimmer;\\編譯失敗因為有Swimmer行為的不一定是shark實例,此時需要加上扮演語法:
Shark shark = (Shark) swimmer;即執(zhí)行時參考shark實例,讓其扮演shark(實際參考對象與扮演對象要一致,否則報錯);
問題三:類可以操作兩個以上的接口,如果有兩個接口。都定義了某方法,操作兩個接口的類會怎樣?
interface Action{void execute(); } interface Some extends Action{void doSome(); } interface Other extends Action{void doOther(); } public class Service implements Some,Other{@Overridepublic void execute(){System.out.println("execute()");}@Overridepublic void doSome(){System.out.println("doSome()");}@Overridepublic void doOther(){System.out.println("doOther()");} }解決過程:以上代碼在編譯時可以通過,但是應(yīng)該思考不同接口定義的方法是否表示不同行為,若表示不同行為,那么類在操作時,應(yīng)該有不同的方法操作,,相對應(yīng)的方法名稱就要不同,這樣類在操作時才可以有兩個不同的方法操作;如果表示相同的行為,可以通過定義一個父接口,在當(dāng)中定義該方法,而其他兩個接口繼承該接口,各自定義自己的doSome(),doOther()方法;
問題四:enum定義枚舉常數(shù)到底是怎么回事?
public final class Action extends Enum{ ...private Action(String s,int i){super(s,i);}public static final Action STOP;public static final Action RIGHT;public static final Action LEFT;public static final Action UP;public static final Action DOWN;...static{STOP = new Action("STOP",0);RIGHT = new Action("RIGHT",1);LEFT = new Action("LEFT",2);UP = new Action("UP"3);DOWN = new Action("DOWN",4);...}}\\Enum枚舉常數(shù)的部分細(xì)節(jié) import static java.lang.System.out public class Game {public static void main(String[] args) {play(Action.RIGHT);play(Action.UP);}public static void play(Action action) {switch(action){case STOP:out.println("播放停止動畫");break;case RIGHT:out.println("播放向右動畫");break;case LEFT:out.println("播放向左動畫");break;case UP:out.println("播放向上動畫");break;case DOWN:out.println("播放向下動畫");break;}} }\\使用Action類的例子解決過程:enum定義了特殊的類,繼承自java.lang.Enum,由編譯程序自己處理,enum中列舉的常數(shù),實際上是public static final,且為枚舉類型實例,無法撰寫程序直接實例化枚舉類型,因為構(gòu)造函數(shù)權(quán)限設(shè)定為private,只有類中才可以實例化。
代碼調(diào)試中的問題和解決過程
接口定義行為:
public interface Swimmer{public abstract void swim(); } public abstract class Fish implements Swimmer { protected String name; public Fish(String name){this.name = name;} public String getName(){return name;} @Override public abstract void swim();} public class Human implements Swimmer {private String name;public Human(String name){this.name = name;}public String getName(){return name;}@Overridepublic void swim(){System.out.printf("人類 %s 游泳%n",name);} } public class Submarine implements Swimmer {private String name;public Submarine(String name){this.name = name;}public String getName(){return name;}@Overridepublic void swim(){System.out.printf("潛水艇 %s 潛行%n",name);} }行為的多態(tài):
public class Ocean {public static void main(String[] args) {doSwim(new Anemonfish("尼莫"));doSwim(new Shark("蘭尼"));doSwim(new Human("賈斯丁"));}static void doSwim(Swimmer swimmer){swimmer.swim();}} public class Seaplane implements Swimmer,Flyer {private String name;public Seaplane(String name){this.name = name;}@Overridepublic void fly(){System.out.printf("海上飛機(jī) %s 在飛%n",name);}@Overridepublic void swim(){System.out.printf("海上飛機(jī) %s 航行海面%n");} } public class FlyingFish extends Fish implements Flyer {public FlyingFish(String name){super(name);}@Overridepublic void swim(){System.out.printf("飛魚游泳");}@Overridepublic void fly(){System.out.println("飛魚會飛");} } public class Swimplayer extends Human implements Swimmer {public Swimplayer(String name){super(name);}@Overridepublic void swim() {System.out.printf("游泳選手 %s 游泳%n", name);} }\\其中要修改之前定義的Human類的字符串變量name的權(quán)限為protected public class Airplane implements Flyer {protected String name;public Airplane(String name){this.name = name;}@Overridepublic void fly(){System.out.printf("飛機(jī) %s 在飛%n",name);} } public class Seaplane extends Airplane implements Swimmer {private String name;{super(name);}@Overridepublic void fly(){System.out.print("海上");super.fly();}@Overridepublic void swim(){System.out.printf("海上飛機(jī) %s 航行海面%n",name);} }public class Helicopter extends Airplane { public Helicopter(String name){ super(name); } @Override public void fly(){ System.out.printf("飛機(jī) %s 在飛%n",name); } }
public class Boat implements Swimmer {protected String name;public Boat(String name){this.name = name;}@Overridepublic void swim(){System.out.printf("船在水面 %s 航行%n",name);} }\\繼承父接口行為接口的默認(rèn):
public interface Action{public static final int STOP = 0;public static final int RIGHT = 1;public static final int LEFT = 2;public static final int UP = 3;public static final int DOWN = 4;} import static java.lang.System.out; public class Game2 {public static void main(String[] args) {play(Action.RIGHT);play(Action.UP);}public static void play(int action){switch(action){case Action.STOP:out.println("播放停止動畫");break;case Action.RIGHT:out.println("播放向右動畫");break;case Action.LEFT:out.println("播放向左動畫");break;case Action.UP:out.println("播放向上動畫");break;case Action.DOWN:out.println("播放向下動畫");break;default:out.println("不支持此動作");}} }關(guān)于使用匿名內(nèi)部類的實例:
public class Client {public final String ip;public final String name;public Client(String ip,String name){this.ip = ip;this.name = name;} } public class ClientEvent {private Client client;public ClientEvent(Client client){this.client = client;}public String getName(){return client.name;}public String getIp(){return client.ip;} } public interface ClientListner{void clientAdd(ClientEvent event);void clientAdd(ClientEvent event); } public class MultiChat {public static void main(String[] args) {Client c1= new Client("127.0.0.1","Caterpillar");Client c2= new Client("192.168.0.2","Justin");ClientQueue queue = new ClientQueue();queue.addClientListener(new ClientListener(){@Overridepublic void clientAdded(clientEvent event){System.out.printf("%s 從 %s 聯(lián)機(jī)%n",event.getName(),event.getIp());}@Overridepublic void clientRemoved(clientEvent event){System.out.printf("%s 從 %s 脫機(jī)%n",event.getName(),event.getIp());}});queue.add(c1);queue.add(c2);queue.remove(c1);queue.remove(c2);} } import java.util.ArrayListpublic class ClientQueue {private ArrayList clients = new ArrayList();private ArrayList listeners = new ArrayList();public void addClientListener(ClientListner listener){listeners.add(listener);}public void add(Client client){clients.add(client);ClientEvent event = new ClientEvent(client);for(int i = 0;i<listeners.size();i++){ClientListner listner = (ClientListner) listeners.get(i);listner.clientAdded(event);}}public void remove(Client client){clients.remove(client);ClientEvent event = new ClientEvent(client);for(int i = 0;i<listeners.size();i++){ClientListner listner = (ClientListner)listeners.get(i);listner.clientremoved(event);}} }以上均為可運(yùn)行代碼,不作運(yùn)行結(jié)果贅述。
本周代碼托管截圖
其他(感悟、思考等,可選)
在本周的學(xué)習(xí)過程中,產(chǎn)生了很多的疑問,通過不斷翻看已經(jīng)學(xué)習(xí)過的章節(jié)復(fù)習(xí)回顧以加強(qiáng)對新知識的理解,同時我覺得本書最大的一個優(yōu)點是,在提出每一個新的概念之前都會舉一個較為具體的例子,附有代碼,列出其不足之處,基于改進(jìn)的基礎(chǔ)上提出新內(nèi)容,繼承、多態(tài)、接口的提出都如此,通過敲代碼,就能感受到區(qū)別以及后者的優(yōu)勢,但是遇到最大的問題也出現(xiàn)在這些代碼上,片段式的代碼,在一些語法細(xì)節(jié)上不便于理解,調(diào)試時也出現(xiàn)很多問題,不知道完整的代碼形式,只能憑著對前面幾章的理解自己嘗試,在此過程中發(fā)現(xiàn)了之前自己理解上的一些偏差,加深了對概念的認(rèn)識,也算是本周的一個收獲吧。繼續(xù)加油,路漫漫其修遠(yuǎn)兮,吾將上下而求索。
學(xué)習(xí)進(jìn)度條
| 目標(biāo) | 5000行 | 30篇 | 400小時 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 21/41 | |
| 第三周 | 450/950 | 3/7 | 20/61 | |
| 第四周 | 443/1393 | 2/9 | 22/83 | 了解了接口與繼承的區(qū)別及運(yùn)用繼承、接口、多態(tài)方式編程的好處 |
參考資料
- Java學(xué)習(xí)筆記(第8版)
- 《Java學(xué)習(xí)筆記(第8版)》學(xué)習(xí)指導(dǎo)
- ...
轉(zhuǎn)載于:https://www.cnblogs.com/xzh20145231/p/5324108.html
總結(jié)
以上是生活随笔為你收集整理的20145231第四周学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android菜鸟的成长笔记(28)——
- 下一篇: 微软拼音输入法十七个技巧