接口类型是与类相似的一种类型,类主要用来对事物进行实际的描述,创建对象实例来具体的描述某一个事物。接口的作用是对功能的概括,并且对外进行展示。
例如在程序中,存在一个支付的功能,那支付并不是一个具体的操作,而是存在支付、退款、统计等等的细节操作,支付这件事情也并不适合采用类来进行描述,因为支付是一个动作,对其进行细致的分析之后,发现其业务都是一些流程化的东西。
注意支付并不能用类来描述,但是订单是可以的。也就是说订单更适合用类来描述一个实体,但支付好像只是一些流程,不太适合使用描述实体的类来描述。
并且支持支付的方式有很多,例如付款可以采用第三方或者银行专用的流程来描述,统计可以使用专用的财会平台或者特殊的算法来实现,也就是说支付并不能具体的被一个类来描述出来,而是一个抽象的概括,并且对这些概括的实现是多种多样的。
虽然一个功能的实现方式有很多种,但对于功能的使用者并不能区别对待,否则就会因为具体实现的方式不同而导致所获得的不同的数据,处理起来是非常麻烦的。
接口的作用就是这样,接口中只能书写抽象的方法和静态公开的常量,抽象的方法描述了一个业务中可能出现的各种流程,但并不会对流程进行具体的描述,而是让其他真正有流程的方法来实现。一个接口可以有很多个实现,在使用时还可以自由的切换具体实现。即使实现的方式是多样的,但都要根据接口所规定的格式来实现。
-
接口是使用interface来声明的。
-
接口没有构造方法,也就没法创建对象。
-
接口通常用作引用类型多态的接受子类类型对象。
-
接口中的属性都是公开静态常量、公开抽象方法,修饰符默认存在。
public final static int age; public abstract void get();
-
抽象类通常对实体类的共性进行抽象,接口通常对流程业务模块的功能方法进行概述。
类与类的继承使用extends关键字连接,子类与父接口的连接使用implements关键字连接。
interface User{
void dengLu();
void zhuCe();
void tianJia();
}
class ChengXuyuan implements User{
public void dengLu(){
}
public void zhuCe(){
}
public void tianJia(){
}
}
一个子类,可以同时拥有多个父接口,并实现所有父接口中的抽象方法。父接口之间使用逗号隔开。也就是说,Java虽然是一种单继承语言,但可以实现多个接口:
interface A{
void set();
}
interface B{
void get();
}
class C implements A,B{
public void get(){}
public void set(){}
}
接口与接口之间使用extends关键字进行继承,一个子接口可以拥有多个父接口,子接口中将拥有所有父接口中的抽象方法,最底层接口的实现类将要实现所有的抽象方法:
interface A{
void set();
}
interface C{
void get();
}
interface B extends A,C{
}
class D implements B{
public void set(){}
public void get(){}
}
虚拟机强转规则
在存在继承或者实现的时候,如果要调用子类特有的方法就要进行强转。无论引用类型是接口类型还是类,都使用小括号的方式。但进行强转的时候在特定情况下会编译时报错:
- 将引用强转成其子类或者孙子类时,不会报错。但如果强转成非继承体系下的类型就会报错。
- 接口可能被任何类实现,类可能会继承任何父类,所以所有引用强转成任何接口类型都不会编译时报错。
编译时报错只是语法的一种控制,实际引用中对象的实际类型如果无法被引用容纳同样会在运行时报错。所以还是建议采用instanceof语句进行检测后安全强转。
接口与抽象类的区别- 接口的属性都是公开静态常量,接口的方法都是公开抽象方法,而抽象类没有限制.
- 接口中不能存在非抽象的方法,而抽象类是可以的.
- 接口是多继承的,而类是单继承的.
- 接口没有构造方法,抽象类存在构造方法.但是他们两个都不能创建对象.
- 抽象类声明为:abstract class,接口声明为:interface.
- 类与类之间使用extends连接,接口与类之间使用implements连接,接口与接口之间使用extends连接.
- 抽象类通常对实体类进行描述,接口通常对业务逻辑进行描述。



