接口概述
java中的接口(interface)是在抽象类的基础上定义的,它可以看成是一种特殊的抽象类,特殊在接口中完全不提供具体实现。如果一个类中存在抽象方法的同时还存在普通方法,那么我们能肯定地说这个类叫做抽象类。当一个抽象类中的所有方法都是抽象方法时,它就变成了一个特殊的抽象类,将这个抽象类进行引申,就能得到一个接口。
因此可以得出接口的功能就是用来描述类应该具有的功能,并不给出具体的实现。就像是一个规定的合集一样。接口就是对实现接口的类提出的一系列标准以及规范。就像在生活中常用的usb接口一样,它满足了大小、形状、长度等要求,而这里要注意的是,根据在java中对接口的定义,生活中usb接口是实现了"接口"的类,而那些对usb接口订下的规范以及要求才是java中的接口。如果这样不好理解,那么可以用螺母的规范来说,一个螺母,在生产它时,他的大小、形状、材质以及要达到一个什么样的功能等都要遵循国家标准或者企业标准,在java中,我们把这样的标准叫做接口。
接口的定义以及实现
一个接口的定义要用到关键字interface,定义接口采用的语法结构为:
interface 接口名 {}
类和接口之间是实现与被实现的关系,如果一个类要实现某个接口,那么在定义这个类的时候,语法结构要做出相应的改变,采用implements关键字来定义类,表示这个类用来实现接口。接口的实现可以是单实现,也可以是多实现,多实现时不同的接口名中间用英文逗号隔开,具体语法结构为:
class 类名 implements 接口名1,接口名2,接口名3,......{}
以下用两个程序来演示接口的定义以及实现
java
package com.jiekou.demo;
/**
* 定义一个接口
*/
public interface Honest {
//定义接口中的方法,要求类来做具体是实现
public abstract void helpOther();
}
java
package com.jiekou.demo;
/**
* 飞行器接口
*/
public interface Volant {
/**
* 表示飞行器在这个星球上飞行的最高高度,单位是公里
*/
public static final int MAX_HIGHT = 100;
/*
飞行方法,调用方法,飞行器起飞
*/
public abstract void fly();
/**
* 让飞行器停止,如果在空中就是让飞行器悬停,如果在地上就是静止
*/
void stop();
}
java
package com.jiekou.demo;
public class Superman implements Volant,Honest{
@Override
public void fly() {
System.out.println("横着飞");
}
@Override
public void stop() {
System.out.println("竖着停");
}
@Override
public void helpOther() {
System.out.println("哪里call我,我飞哪里!");
}
}
在上面的程序中能够发现在定义接口中的常量和方法之前的修饰符可以不写,系统会默认拥有修饰符。换而言之,在接口之中不能出现变量,出现的只能是常量,在接口中的所有方法都是抽象方法。这也就是在接口中通常会有大量注释的原因。如果接口中没有足够的注释,那么这个接口具体要求类实现什么样的功能就无法确定。
接口中的默认方法以及静态方法
在JDK8以后,java中的接口中可以添加一些有具体实现的方法。这些方法被分成了两类,一类是静态方法,用static 来修饰,静态方法从属于接口(接口是特殊的类),调用时要通过类的对象来调用;另一类方法叫默认方法,默认方法要用default关键字来修饰,关于default关键字在封装中有所介绍,但是在封装中default是可以不写的,这里为了将普通方法和默认方法区分开来就得写上了。
接口中的默认方法和静态方法一般的开发中不经常使用,但仍然需要对它们的存在拥有一定的了解。以下用两个代码来演示它们的使用。
java
package com.jiekou.demo;
/**
* 测试默认方法
*/
public class TestDefault {
public static void main(String[] args) {
B b = new Test_B();
b.moren();
}
}
interface B {
default void moren(){
System.out.println("我是接口B中的默认方法");
}
}
class Test_B implements B{
public void moren(){
System.out.println("Test_B.moren");
}
}
java
package com.jiekou.demo;
/**
* 测试静态方法
*/
public class TestStaticMethod {
public static void main(String[] args) {
A.testMetod();
Test_A.testMethod();
}
}
interface A{
public static void testMetod(){
System.out.println("A.testMetod");
}
}
class Test_A implements A{
public static void testMethod(){
System.out.println("Test_A.testMethod");
}
}
接口的多继承
在上面提到过,接口属于特殊的类,那么接口也应该具有类的特性,也就是说,接口也能进行继承。但是这里要强调的是,与普通类只能进行单继承不同,接口可以进行都继承。用一个简单的比喻就是,企业标准、地方标准和国家标准三者之间的关系,企业标准作为企业规范要继承地方标准和国家标准。也就是说企业标准这个接口是地方标准和国家标准这两个接口的子类。企业生产一个商品只有在要满足国家标准、地方标准的前提下,再满足企业标准,这个产品对于企业来说才是合格品。
综上所述,接口能够进行多继承,多继承时,实现类必须实现所有接口(包括子类接口和父类接口)的所有抽象方法。