开发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("错就错呗,无所谓!"