基本概念
接口类似于抽象类(可以看做是一个更彻底的抽象类),体现为接口中所有的成员方法都是抽象方法。
定义接口的关键字是interface
实现接口的关键字是implements
生活中的接口:U盘、USB风扇、USB鼠标USB接口本身没有实现任何功能USB接口规定了数据传输的要求USB接口可以被多种USB设备实现编写USB接口:根据需求设计方法实现USB接口:实现所有方法使用USB接口:用多态的方式使用
注意:
接口中不能定义成员变量,只能定义常量
接口中只能有被public,static,final关键字共同修饰的常量
接口中的所有方法都是抽象方法
接口中的方法只能被public,abstract,static,default(jdk8之后的新特性),和strictfp修饰
面向接口编程
接口存在的意义:java中一个类只能有一个父类,所以用接口可以实现多继承的逻辑。
接口的定义和使用
接口的定义:使用interface关键字用来声明一个接口。
[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n]
{
// 声明常量 抽象方法 静态方法 默认方法
}
接口的使用:类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
[访问修饰符] class 类名 implements 接口名1,接口名2……{ }
结合继承:
[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{ }
案例:
设计一个Fly接口:
设计一个InterFaceA接口:
设计一个InterFaceB接口:
设计一个动物接口:
/*
jdk8之前 接口只能定义静态常量和抽象方法
jdk8之后 接口增加了静态方法和默认方法
interface 修饰的是接口
接口中没有构造方法,不能创建对象
接口也表示抽象(功能设计),也是需要其他类来实现的(继承)
一个接口可以继承多个接口
一个类可以实现多个接口
一个类只能直接继承一个类
*/
public interface Animal extends Fly,InterFaceA{
//public static final int num = 10;
int num = 10; //接口中的成员变量默认是静态常量
//public abstract void eat();
void eat(); //接口定义抽象方法
//静态方法直接通过接口名调用
public static void testStatic(){
System.out.println('testStatic');
}
//默认 通过子类对象调用
public default void testDefault(){
System.out.println('testDefault');
}
}
设计一个Dog类继承Object类实现Animal、InterFaceB接口:一个类实现了某个接口后必须实现该接口定义的所有方法(因为接口中的方法都为抽象方法,jdk8之前),接口间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口,子接口继承了父接口中定义的所有方法(这里由于子接口继承了父接口的所有方法,所以当一个类实现了这个子接口时,那么这个类必须实现(重写)这个子接口与父接口中的所有方法(jdk8之前)
//public abstract class Dog implements Animal{
public class Dog extends Object implements Animal,InterFaceB{
@Override
public void eat() {
System.out.println('狗吃骨头');
}
@Override
public void fly() {
}
@Override
public void testA() {
}
@Override
public void testB() {
}
}
设计一个Cat类实现Animal接口:
public class Cat implements Animal{
@Override
public void eat() {
System.out.println('猫吃鱼');
}
@Override
public void fly() {
}
@Override
public void testA() {
}
}
测试:
public class Test {
public static void main(String[] args) {
/*
接口名只能调用接口中静态的成员
*/
//System.out.println(Animal.num);
//Animal.testStatic();
//接口类型的引用指向实现类的对象,也就是形成了多态
//这里的Dog实现了Animal接口,那么Dog也就是Animal接口的实现类
Animal dog = new Dog();
Animal cat = new Cat();
}
public void feedAnimal(Animal animal){
animal.eat();
}
}
接口的特性
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
接口中方法可以是抽象的,静态的,默认的
接口中声明的属性默认为publicstaticfinal的
接口不是被类继承了,而是要被类实现
接口不能实例化对象,无构造方法
一个类可以实现多个接口
与继承关系类似,接口与实现类之间存在多态性
一个接口能继承其它多个接口
当类实现接口的时候,类要实现接口中所有的抽象方法。否则,类必须声明为抽象的类
即:要么实现接口中所有的抽象方法,要么把自己也声明为抽象类
类和接口之间的关系
类和类之间的关系:
类和类之间使用extends关键字表示继承的关系——类与类之间只支持单继承
类和接口之间的关系:
类和接口之间使用implements表示实现的关系——类与接口之间支持多实现(也就是一个类之可以同时实现多个接口)
接口和接口之间的关系:
使用extends表示继承的关系——接口之间可以多实现
java中一个类只能有一个父类,所以接口是为了解决java中无法进行多继承的问题。
抽象类与接口的区别:
定义抽象类的关键字abstractclass,而定义接口的关系是interface
继承抽象类的关键字extends,而实现接口的关键字是implements
继承抽象类只支持单继承,而实现接口可以多实现
抽象类中可以有构造方法,而接口中不可以有构造方法
抽象类中可以有成员变量,而接口中只能有常量
抽象类中可以有一般方法,而接口中只能有抽象方法(jdk8之前)
抽象类中增加方法不一定会影响子类,而接口中增加方法通常都会影响子类(抽象类中增加的方法可以是抽象方法,也可以是一般方法,所以不一定需要在子类中实现,接口中增加的方法只能是抽象方法也就必须在子类中实现)
从jdk8开始允许接口中出现非抽象方法,但需要使用default关键字修饰
为什么增加第8个这个特性:
原因一:有的接口中方法假如特别多,而这些方法都是抽象方法的话,如果有一个类需要实现这个接口时就要实现这个接口中的二百个抽象方法,这样的话代码量太大了
原因二:假如我们在写完代码之后,客户改变了需求,要求在接口之中加一个新的方法,如果这个方法按以前jdk8之前那样,也就是这个方法如果必须为抽象方法时,我们就需要修改所有实现了这个接口的子类,就会造成牵一发而动全身
所以我们就增加了这个新特性,也就是可以通过default修饰接口中的方法表示默认实现,也就表示这个被default修饰的方法是一般方法,也就是不是抽象方法,子类也就可以实现也可以不实现
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点