本文共 3510 字,大约阅读时间需要 11 分钟。
如果定义类的时候发现类的内部只有全局常量和抽象方法的话,则这个类可定义为接口。我们可以在JDK文档中看到有大量的类实现了接口,接口的定义在Java程序中使用还是挺常见的。
例如查看String类的文档,可以看到如下定义:
java.lang.String
1.接口必须有子类,子类使用implements进行接口实现,一个子类可以同时实现多个接口;
2.接口子类若不是抽象类,则一定要覆写接口之中的全部抽象方法;
3.接口对象可以利用子类向上转型,进行实例化操作;
4.接口多实现的向上转型限制问题:若子类实现多个接口(例如class C implements A,B),当用子类实现父接口的实例化时,父接口A的实例化不能访问父接口B的方法;
5.先继承(extends),后实现(implements);
1.接口之中的全部方法访问权限都是public,不管写与不写都一样,因为大部分类都是由接口规定的,所以才有了只要是方法大部分使用public定义的原因;
2.在接口中既然全部都是由抽象方法和全局常量所组成,所以在定义的时候以下两种定义方式一样:
public static final String MSG_A = "hello ,interface A !"; public abstract void fun_A() ; String MSG_A = "hello ,interface A !"; void fun_A() ;
3.一般在定义接口的时候定义方法比较多,定义全局常量比较少;
4.一个抽象类可以使用implements实现接口。但是一个接口却不能继承一个抽象类,可是一个接口可以使用extends继承多个父接口(接口的多继承);
5.任何内部的结构实际上都不受定义的限制,所以在一个接口里面也可以继承定义内部接口或内部抽象类,而且用static定义的内部接口就是一个外部接口。
在实际中,接口有三大核心功能:
1.使用接口定义规范标准
2.接口表示一种能力(java.lang.Interface Cloneable)
3.将服务器的远程视图暴露给客户端
利用工厂类减耦合,在main函数中使用factory类来接收用户传递进来的参数,根据参数判断所需要新生成的类,这样避免了用户直接操作main函数,降低了耦合度。
interface fruit { public void eat() ;} class apple implements fruit { public void eat() { System.out.println("吃苹果!") ; }} class orange implements fruit { public void eat() { System.out.println("吃橘子!") ; }} class factory { public static fruit getInstance(String str) { if(str.equals("apple")) { return new apple() ; } if(str.equals("orange")) { return new orange() ; } return null ; }} public class InterfaceDemo { public static void main(String args[]) { fruit f = factory.getInstance(args[0]) ; f.eat(); } }
在本结构中,发现一个接口定义了两个子类,一个子类完成核心的真实业务主题,而另一个提供所有的辅助功能
interface Network { //网络连接 public void browse(String url) ;} class RealNetwork implements Network { public void browse(String url) { System.out.println("访问站点:" + url ) ; }} class ProxyNetwork implements Network { private Network net ; //保存真正的上网连接 public ProxyNetwork(Network net) { this.net= net ; } public boolean check(String url) { if(url.contains("google")) { return false ; } return true ; } public void browse (String url) { if(this.check(url)) { //通过检查了,可以上网 this.net.browse(url); } else{ System.out.println("404 NOT FOUND the PAGE!") ; } } public void record (String url) { System.out.println("上网记录:" + url) ; }} public class InterfaceDemo { public static void main(String args[]) { Networknw = new ProxyNetwork(new RealNetwork()) ; nw.browse("www.sina.com"); nw.browse("www.google.com"); nw.browse("www.google.sina.com"); }}
程序结果:
访问站点:www.sina.com
404 NOT FOUND the PAGE!
404 NOT FOUND the PAGE!
抽象类和接口是整个项目最大的组成灵魂。通过对比分析可以发现,在项目中使用抽象类还是接口都一样,可是由于抽象类的单继承局限,如果二者皆可使用时,优先使用接口。
NO | 区别 | 抽象类 | 接口 |
1 | 关键字 | abstract 类名称{} | interface 接口名称{} |
2 | 组成 | 普通方法、构造方法、抽象方法、常量、变量 | 全局常量、抽象方法 |
3 | 权限 | 各类权限 | 只能是public |
4 | 使用 | extends只能继承一个父类 | 子类使用implements可以实现多个接口 |
5 | 关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但是可以继承多个接口,实现接口多继承 |
6 | 设计模式 | 模板设计模式 | 工厂、代理 |
7 | 局限 | 单继承局限 | 无局限 |
转载地址:http://mntii.baihongyu.com/