如果定义类的时候发现类的内部只有全局常量和抽象方法的话,则这个类可定义为接口。我们可以在JDK文档中看到有大量的类实现了接口,接口的定义在Java程序中使用还是挺常见的。
例如查看String类的文档,可以看到如下定义:
java.lang
类 String
java.lang.Object java.lang.String
-
所有已实现的接口:
- Serializable, CharSequence, Comparable< String>
1、定义相关问题:
1.接口必须有子类,子类使用implements进行接口实现,一个子类可以同时实现多个接口;
2.接口子类若不是抽象类,则一定要覆写接口之中的全部抽象方法;
3.接口对象可以利用子类向上转型,进行实例化操作;
4.接口多实现的向上转型限制问题:若子类实现多个接口(例如class C implements A,B),当用子类实现父接口的实例化时,父接口A的实例化不能访问父接口B的方法;
5.先继承(extends),后实现(implements);
2、几点说明:
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定义的内部接口就是一个外部接口。
3、接口功能
在实际中,接口有三大核心功能:
1.使用接口定义规范标准
2.接口表示一种能力(java.lang.Interface Cloneable)
3.将服务器的远程视图暴露给客户端
4、接口的两个应用
(1)接口应用————工厂设计模式
利用工厂类减耦合,在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();
}
}
(2)接口应用————代理设计模式(Proxy)
在本结构中,发现一个接口定义了两个子类,一个子类完成核心的真实业务主题,而另一个提供所有的辅助功能
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!
5.抽象类与接口的区别
抽象类和接口是整个项目最大的组成灵魂。通过对比分析可以发现,在项目中使用抽象类还是接口都一样,可是由于抽象类的单继承局限,如果二者皆可使用时,优先使用接口。
NO | 区别 | 抽象类 | 接口 |
1 | 关键字 | abstract 类名称{} | interface 接口名称{} |
2 | 组成 | 普通方法、构造方法、抽象方法、常量、变量 | 全局常量、抽象方法 |
3 | 权限 | 各类权限 | 只能是public |
4 | 使用 | extends只能继承一个父类 | 子类使用implements可以实现多个接口 |
5 | 关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但是可以继承多个接口,实现接口多继承 |
6 | 设计模式 | 模板设计模式 | 工厂、代理 |
7 | 局限 | 单继承局限 | 无局限 |