Java接口的经典应用

1.JAVA多态接口动态加载实例

为某研究所编写一个通用程序,用来计算每一种交通工具运行 1000公里所需的时间,已知每种交通工具的参数都是3个整数A、B、C的表达式。现有两种工具:Car 和Plane,其中Car 的速度运算公式为:A*B/C,Plane 的速度运算公式为:A+B+C。需要编写三类:ComputeTime.java,Plane.java,Car.java和接口Common.java,要求在未来如果增加第3种交通工具的时候,不必修改以前的任何程序,只需要编写新的交通工具的程序。其运行过程如下,从命令行输入ComputeTime的四个参数,第一个是交通工具的类型,第二、三、四个参数分别时整数A、B、C,举例如下:      

计算Plane的时间:”javaComputeTime Plane 20 30 40″

计算Car007的时间:”java ComputeTime Car007 23 34 45″
如果第3种交通工具为Ship,则只需要编写Ship.java,运行时输入:”java ComputeTime Ship 22 33 44″
提示:充分利用接口的概念,接口对象充当参数。


实例化一个对象的另外一种办法:Class.forName(str).newInstance();例如需要实例化一个Plane对象的话,则只要调用Class.forName(“Plane”).newInstance()便可。

代码:
1. ComputTime.java 请确保输入正确,其中没有捕捉NumberFromatException

package com.hk.demo.interfacetest;
 
  1. import java.lang.*;

  2. public class ComputeTime {

  3. public static void main(String args[]) {

  4. System.out.println("交通工具: "+args[0]);

  5. System.out.println(" 参数A: "+args[1]);

  6. System.out.println(" 参数B: "+args[2]);

  7. System.out.println(" 参数C: "+args[3]);

  8. double A=Double.parseDouble(args[1]);

  9. double B=Double.parseDouble(args[2]);

  10. double C=Double.parseDouble(args[3]);

  11. double v,t;

  12. try {

 
  1. //这里com.hk.demo.interfacetest为包名

  2. Common d=(Common) Class.forName("com.hk.demo.interfacetest."+args[0]).newInstance();

  3. v=d.runTimer(A,B,C);

  4. t=1000/v;

  5. System.out.println("平均速度: "+v+" km/h");

  6. System.out.println("运行时间:"+t+" 小时");

  7. } catch(Exception e) {

  8. System.out.println("class not found");

  9. }

  10. }

  11. }

这个类,用来调用显示给用户,用户通过这个类,可以直接输入类型、参数就可以实现其目的。
2.Plane.java

 
  1. package com.hk.demo.interfacetest;

  2.  
 
  1. public class Plane implements Common {

  2. public double runTimer(double a, double b, double c) {

  3. return (a+ b + c);

  4. }

  5. }

  6.  
  7.  
  8. 3. Car.java

  9.  
  10.  
  11. package com.hk.demo.interfacetest;

  12.  
 
  1. public class Car implements Common {

  2. public double runTimer(double a, double b, double c) {

  3. return ( a*b/c );

  4. }

  5. }

 

4.Common.java

 
  1. package com.hk.demo.interfacetest;

  2.  
  3.  
  4. //方式一: 通过继承普通父类的方式,重新写父类中的方法以达到覆盖

  5. //public  class Common { 

  6. //   double runTimer(double a,double b, double c){

  7. //   return 0;

  8. //   };

  9. //}

  10.  
  11.  
  12. //方式二:接口的方式 推荐

  13. public interface Common{

  14. double runTimer(double a,double b,double c);

  15. }

  16.  
  17.  
  18. //方式三:abstract关键字方式 这跟方式一是一样的,只是用了abstract修饰,不能实例化该类。具体请查看abstract的用法

  19. //public abstract class Common{

  20. // abstract double runTimer(double a,double b,double c);

  21. //}

 

而,Car中的runTimer和Plane中的runTimer为什么一定要继承Common接口呢?感觉这不是必须的嘛!!我们完全可以写一个public的方法,名字为runTimer,这种目的是不是也能也能实现。

但是

    1、倘若plane中写了runTimer来计算速读,而另一个Car中写了runTime这样的话,当实例化Car的时候,调用runTimer不就错了吗?所以此时的接口可以统一约束相同功能但是实现效果不同的情况。下面是Common接口的代码。

   2、对1的理解其实是错误的,看我们代码中ComputTime类中根据不同的参数实例化不同的对象。既然是不同的对象那么

Common d=(Common) Class.forName(“CalTime.vehicle.”+args[0]).newInstance();

 

这句话不就错了吗?这里显然都是Common对象,怎么回事不同的对象呢?所以只有一个解释,那就是Common可以代表这些new出来的对象,所以common就是他们的父类。

  3、既然是父类当然可以用extend继承父类的方法,当然这样也可以,也可以用abstract类。但是extend只能单一继承,并不能继承多个父类,所以有的时候必须要用interface。(这里因为就继承一个类中的方法,所以用exend继承父类和implement继承接口都一样的。我的附件中两种情况都列出来了。)


一次运行结果:
这里是通过控制台运行的,如果使用的是eclipse可以参考我的上一篇博客,eclipse中如何给main输入参数。

C:\java>java     ComputeTime Car 100 45 67
交通工具: Car
参数A: 100
参数B: 45
参数C: 67
平均速度: 67.16417910447761 km/h
运行时间:14.88888888888889 小时


C:\java>java     ComputeTime Plane 130 45 67
交通工具: Plane
参数A: 130
参数B: 45
参数C: 67
平均速度: 242.0 km/h
运行时间:4.132231404958677 小时
 

现在回到我们的最初的要求,倘若我们新加一个Ship类,而且不改变之前的代码,是不是就很简单了呢?这样拓展性也就很强了。

演示了接口的经典使用方法。嗬嗬,只有意会,不可言传。 Thinking in Java 对此也做出了深刻的分析,可以查看下。

附件 链接: http://pan.baidu.com/share/link?shareid=175105860&uk=3037731871
2.接口作为方法的参数传递。


先看一个接口应用的例子:


interface Extendbroadable{
public void inPut();
}
class KeyBroad     implements Extendbroadable{
public void inPut(){
System.out.println(“\n hi,keybroad has be input into then mainbroad!\n”);
}
}
class NetCardBroad     implements Extendbroadable{
public void inPut(){
System.out.println(“\n hi,netCardBroad has be input into then mainbroad!\n”);
}
}
class CheckBroad{
public void getMainMessage(Extendbroadable ext){
ext.inPut();
}
}
public class InterfaceTest01{
public     static void main(String []args){
KeyBroad kb=new KeyBroad();
NetCardBroad ncb=new NetCardBroad();
CheckBroad cb=new CheckBroad();
cb.getMainMessage(kb);
cb.getMainMessage(ncb);


}
}


可以将借口类型的参数作为方法参数,在实际是使用时可以将实现了接口的类传递给方法,后方法或按照重写的原则执行,实际调用的是实现类中的方法代码体,这样便根据传进屋的参数的不同而实现不同的功能。

 

重要的是,当我以后徐要林外一个对象并且拥有接受说生命的方法的时候的时候,我们不必须原类,只需新的类实现借口即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值