来谈谈JAVA面向对象 - 鲁班即将五杀,大乔送他回家??

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

转载于:https://www.cnblogs.com/banxian-yi/p/10579444.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值