開發IDE為Eclipse或者MyEclipse。
首先,如果我們使用面向過程的思維來解決這個問題,就是第一步做什么,第二步做什么?
魯班即將五殺,大喬送他回家
這個現象可以簡單地拆分為兩步,代碼大概是這個樣子的:
public class Test01 { public static void main(String[] args) { System.out.println("魯班即將五殺"); System.out.println("大喬送他回家"); } }
面向過程的思維大概就是這樣。
如果我們用面向對象的思維來看待這個問題,首先,得抽象出有哪幾個對象。
魯班類:
/*** 魯班類* @author Administrator**/
public class Luban { private String name = "魯班"; //英雄的名字 private int killCount = 0; //擊殺個數 }
因為魯班會有一個從?first blood?到?penta kill?的過程 , 在這個過程中,需要對killCount 這個變量一步步遞增,所以,我們給它再加一個kill方法。
public void kill(){ killCount++; switch (killCount) { case 1: System.out.println("First Blood!"); break; case 2: System.out.println("Double Kill!"); break; case 3: System.out.println("Triple kill!"); break; case 4: System.out.println("Quadra kill!"); break; case 5: System.out.println("Penta kill!"); break; default: break; } }
這個時候,我們發現,訪問不了私有變量。我們需要給name和killCount添加對應的get,set方法:
Alt + S --> Generator Getters and Setters -->
這樣就自動生成了!
至此,魯班類告一段落,接下來編寫大喬類:
/*** 大喬類* @author Administrator**/
public class Daqiao { private String name = "大喬"; /** * 放大招的方法 */ public void DaZhao(Luban luban){ } }
大招方法需要把魯班給裝進去,大家思考如何實現送魯班回家的過程?
這邊我提供一個思路,給魯班添加一個私有的布爾屬性 isAtHome,默認是false。當魯班被傳遞進大喬的大招方法里之后,就改為true。
private boolean isAtHome = false; //是否回泉水?
別忘了生成 get set 方法。
于是乎,大招方法就變成了這樣:
/*** 放大招的方法*/
public void DaZhao(Luban luban){ luban.setAtHome(true); }
現在大家再想一個問題,當魯班回泉水了,還能不能繼續調用 kill 方法?
肯定是不能了,修改后的 kill 方法,在killCount++之前就應該return掉:
public void kill(){ if(this.isAtHome){ setName("魯班七號"); System.out.println(name + ":我是誰,在干什么??"); return; } killCount++; switch (killCount) { case 1: System.out.println("First Blood!"); break; case 2: System.out.println("Double Kill!"); break; case 3: System.out.println("Triple kill!"); break; case 4: System.out.println("Quadra kill!"); break; case 5: System.out.println("Penta kill!"); break; default: break; } }
測試:
import bean.Daqiao; import bean.Luban; public class Test02 { public static void main(String[] args) { Luban luban = new Luban(); luban.kill(); luban.kill(); luban.kill(); luban.kill(); Daqiao dq = new Daqiao(); dq.DaZhao(luban); luban.kill(); } }
以上就是我們面向對象的一般思路,先抽象出有幾個類,然后設計每個類中有哪些方法?
面向對象有三大特性,分別為繼承,封裝和多態。
繼承
還是這個例子,思考:魯班和大喬都屬于王者峽谷里面的英雄。他們有很多共同的特性。我們可以抽象出一個通用的英雄類,Hero類 。
package bean;/** * 英雄類 * @author Administrator * */ public class Hero { protected String name; protected int killCount = 0; protected boolean isAtHome = false; public void kill(){ } public void DaZhao(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getKillCount() { return killCount; } public void setKillCount(int killCount) { this.killCount = killCount; } public boolean isAtHome() { return isAtHome; } public void setAtHome(boolean isAtHome) { this.isAtHome = isAtHome; } }
然后讓魯班和大喬都繼承這個類。
對魯班而言,繼承了Hero類以后,只需要重寫kill即可,省去了很多代碼:
package bean;/** * 魯班類 * @author Administrator * */ public class Luban extends Hero{ public void kill(){ if(this.isAtHome){ System.out.println(name + ":我是誰,在干什么??"); return; } killCount++; switch (killCount) { case 1: System.out.println("First Blood!"); break; case 2: System.out.println("Double Kill!"); break; case 3: System.out.println("Triple kill!"); break; case 4: System.out.println("Quadra kill!"); break; case 5: System.out.println("Penta kill!"); break; default: break; } } }
大喬類也是同樣的道理:
package bean;/** * 大喬類 * @author Administrator * */ public class Daqiao extends Hero{ /** * 放大招的方法 */ public void DaZhao(Luban luban){ luban.setAtHome(true); } }
這個時候,我們可以看到,繼承的一個好處就是可以省去很多重復的代碼,提高了代碼的復用率。
封裝
現在我們考慮如何讓java程序來播放一個音樂?
經過改造后的魯班 kill 方法:
public void kill(){ if(this.isAtHome){ setName("魯班七號"); System.out.println(name + ":我是誰,在干什么??"); return; } killCount++; switch (killCount) { case 1: //解析音樂地址 try{ URL codebase = new URL("file:/E:/workspace/demos/1.wav"); AudioClip a = Applet.newAudioClip(codebase); a.play(); //播放音樂 Thread.sleep(2000); }catch(Exception e){ System.out.println("錯就錯唄,無所謂!"); } System.out.println("First Blood!"); break; case 2: //解析音樂地址 try{ URL codebase = new URL("file:/E:/workspace/demos/2.wav"); AudioClip a = Applet.newAudioClip(codebase); a.play(); //播放音樂 Thread.sleep(2000); }catch(Exception e){ System.out.println("錯就錯唄,無所謂!"); } System.out.println("Double Kill!"); break; case 3: //解析音樂地址 try{ URL codebase = new URL("file:/E:/workspace/demos/3.wav"); AudioClip a = Applet.newAudioClip(codebase); a.play(); //播放音樂 Thread.sleep(2000); }catch(Exception e){ System.out.println("錯就錯唄,無所謂!"