首先先介绍一下接口技术:接口技术主要用来描述类具有什么功能,而并不给出类中功能的具体实现。
一、接口的概念
在 《 JAVA 核心技术 卷一》中对接口有这样的描述:在 JAVA 程序设计语言中,接口不是类,而是对类的一组需求的描述,而这些类要遵从接口描述的同一格式进行定义。
也就是说,接口并不是一个类,但是如果想实现接口中的方法,就要符合接口的要求。所以可以知道,接口中的方法都是抽象方法,想要实现它的类必须重写这些抽象方法才可以。
二、接口的定义
定义一个接口,要使用 interface 关键字,而且其中的方法必须是抽象方法,定义方法时默认是公有的(public关键字可以省略),而且abstract关键字要省略。
interface USB
{
public void work(); //定义接口中的方法
}
而在JDK1.8之后添加了default方法和static方法。
先来看default方法。default修饰的默认方法可以有方法体,而且可以不用在实现接口的类中重写。如果重写,则调用实现类中重写的方法。
interface A
{
String saySomething();
default String sayHello() {
return "just say hello";
}
}
class B implements A{
public String saySomething() {
return "i just wanna say something.";
}
}
public class TestDemo02
{
public static void main(String[] args)
{
A a = new B();
System.out.println(a.saySomething());
System.out.println(a.sayHello());
}
}
运行之后的输出结果是:
i just wanna say something.
just say hello
再来看static修饰的方法。static修饰的方法也可以在接口中拥有方法体,在调用时像普通静态方法一样使用类名调用即可:
interface A
{
String saySomething();
static String sayHello() {
return "just say hello";
}
}
class B implements A{
public String saySomething() {
return "i just wanna say something.";
}
}
public class TestDemo02
{
public static void main(String[] args)
{
A a = new B();
System.out.println(a.saySomething());
System.out.println(A.sayHello());
}
}
输出结果依旧是:
i just wanna say something.
just say hello
但是要注意的一点是,如果一个类实现了两个接口,而两个接口中有同名的default方法,则会编译错误。
三、接口的使用
从上面的代码中已经可以看到,如果一个类想要实现一个接口,要使用关键字 implements 。在实现接口的类的实例化上,也遵循多态这一特性,格式如: 接口名 变量名 = new 类名();
interface USB
{
//1 USB接口定义标准
// 初始化工作
public void install();
// 工作开始
public void work();
}
class Phone implements USB
{
// 初始化工作
public void install(){
System.out.println("手机开始初始化");
}
// 工作开始
public void work(){
System.out.println("手机开始传输数据");
}
}
class Print implements USB
{
// 初始化工作
public void install(){
System.out.println("打印机开始初始化");
}
// 工作开始
public void work(){
System.out.println("打印机开始打印");
}
}
class Computer
{
public void plugin(USB u){ //向上转型 接收实现类
u.install();
u.work();
}
}
public class IntDemo
{
public static void main(String[]args){
Computer p=new Computer();
p.plugin(new Print());
}
}
四、接口与抽象类的比较
抽象类 | 接口 | ||
1 | 定义 | absract | interface |
2 | 组成 | 普通方法,抽象方法,构造方法,普通属性 | 抽象方法,全局常量,默认方法,静态方法 |
3 | 访问权限 | 全部 | jdk1.8默认是default,可以定义为public |
4 | 关系 | 一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
5 | 使用 | extends | implements |
6 | 特殊点 | 一个接口可以继承多个接口 |