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