多态与动态绑定机制,在实践中非常常见,适用于许多场景,尤其是对于设计复杂的测试用例,更能发挥强大的作用。
先实现一个demo,把思路走通再说。
/**
*
*/
package ball;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* @author administrator
*
*/
public class BallTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BallTest ball = new BallTest();
ball.testMethod();
}
private void testMethod() {
// 初始化
BallPlay ballPlay = null;
System.out.println("提示:1是乒乓球赛,2是足球赛,3是羽毛球赛,4是台球赛!");
Scanner scanner = new Scanner(System.in);
int vChoice = 0;
for (int i = 0; i < 3; i++) {
try {
System.out.print("现在看哪个比赛:");
vChoice = scanner.nextInt(); // 程序运行时,才能知道具体的实例和方法调用,而不是在编译时确定
switch (vChoice) {
case 1:
ballPlay = new PingPangBall();
ballPlay.playStarting("乒乓球赛");
break;
case 2:
ballPlay = new FootBall(); // 子类可以自动向父类转换
((FootBall) ballPlay).lookGiftBox(); // 父类向子类转换必须进行强制转换,当然这种转换是安全的
ballPlay.playStarting("足球赛");
break;
case 3:
ballPlay = new Badminton();
ballPlay.playStarting("羽毛球赛");
break;
case 4:
ballPlay = new BilliardBall();
ballPlay.playStarting("台球赛");
break;
default:
throw new InputMismatchException("输入错误!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
// System.out.println("您的输入非法!");
} finally {
ballPlay = null;
System.out.println("第" + (i + 1) + "场赛事已经结束!");
}
}
scanner.close();
System.out.println("好了,回家吧!");
}
}
class BallPlay {
public BallPlay() {
System.out.print("球赛-->");
}
public void playStarting(String strPlayName) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
System.out.println("赛场出事故了," + strPlayName + "赛事提前结束!");
}
}
}
class PingPangBall extends BallPlay {
public PingPangBall() {
System.out.println("乒乓球赛正在直播。。。");
}
public void playStarting(String strPlayName) {
super.playStarting(strPlayName);
}
}
class FootBall extends BallPlay {
public FootBall() {
System.out.println("足球赛正在直播。。。");
}
public void playStarting(String strPlayName) {
super.playStarting(strPlayName);
}
public void lookGiftBox() {
System.out.println("足球赛场大,送你一台望远镜!");
}
}
class Badminton extends BallPlay {
public Badminton() {
System.out.println("羽毛球赛正在直播。。。");
}
public void playStarting(String strPlayName) {
super.playStarting(strPlayName);
}
}
class BilliardBall extends BallPlay {
public BilliardBall() {
System.out.println("台球赛正在直播。。。");
}
public void playStarting(String strPlayName) {
super.playStarting(strPlayName);
}
}
现在的应用场景是:需要对若干个文件进行封装打包,然后提交给服务器。但是不能的业务需求决定了打包封装的形势和数据格式是有点差别的。那么好了,让我们先设计一个基类作为封装类,然后再设计若干个业务类,从这个封装类继承下来,紧接着是业务执行单元,在这里就是BallTest了,在业务执行单元,程序运行时,动态决定到底走哪个业务分支。
运行结果示例: