目录
一、接口的概念
在生活中接口的例子比比皆是,下面便是一些接口
这些接口根据他们的形状和功能的不同,可以接入不同的设备。例如笔记本上的USB口可以插鼠标、U盘、键盘等符合USB接口协议的设备,通过这个例子可以看出,接口是公共的行为规范,只要符合规范标准,就可以通用。
在java中接口可以看成是多个类的公共规范,是一种引用数据类型。定义的是一组规则.
二、语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就算定义了一个接口。
接口当中的成员方法,不能有具体的实现,它里面是抽象方法:默认是public abstract的方法,要是想定义一个可以实现的方法需使用default来修饰,接口中可以实现静态方法,接口内部的成员变量默认是 public static final修饰
接口中的所有的定义其实都是抽象的。
public interface IShape {
public static final int a = 1;
int b= 2;
public abstract void func1();
default public void func2(){
System.out.println("这是一个默认方法");
}
public static void func3(){
System.out.println("这是一个静态方法");
}
void func4();
}
接口命名:
1. 创建接口时, 接口的命名一般以大写字母 I 开头;
2. 接口的命名一般使用 "形容词" 词性的单词;
3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性。
三、接口使用
接口不能被实例化,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。可以通过class 类名 implement 接口名来使用接口
public class Test implements IShape{
@Override
public void func1() {
//该方法必须重写
}
@Override
public void func2() {
//该方法可以选择是否重写
}
}
其中抽象方法必须重写,而被default修饰的方法可以不重写。
接口特性:
1、接口是引用数据类型,但是它不能直接new接口对象,但是可new实现它的类
public interface USB {
void openDevice();
void closeDevice();
}
public class Mouse implements USB{
@Override
public void openDevice() {
System.out.println("打开鼠标");
}
@Override
public void closeDevice() {
System.out.println("关闭鼠标");
}
}
public class Test {
public static void main(String[] args) {
USB usb = new Mouse();
}
}
2、接口中的所有的定义其实都是抽象的,其内部定义的所有方法会被隐式的指定为public abstract.
3、接口内定义的方法不能实际实现,只能由实现接口的类来实现,接口实际上可以看作定义了一组规则。
4、因为接口内方法默认权限为public,所以在实现接口时重写方法不能使用默认访问权限。
5、接口中可以含有变量,但是接口中变量会被指定为public static final变量
6、接口中不能有静态代码块,和构造方法
7、接口虽然不是类,但是其编译完成的字节码文件也是.class
8、如果类没有实现接口中的全部抽象方法,则该类必须设置为抽象类。
四、实现多个接口
在Java中虽然不支持多继承,但是我们可以用一个类实现多个接口
public class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface Fly {
void flying();
}
public interface Run {
void running();
}
public class Cat extends Animal implements Run{
//继承Animal类,实现Run接口
@Override
public void running() {
System.out.println(getName()+"正在地上跑");
}
}
public class Polatouche extends Animal implements Fly,Run{
@Override
public void flying() {
//实现Fly接口
System.out.println(getName() + "向主人的手飞去");
}
@Override
public void running() {
//实现Run接口
System.out.println(getName() + "在地上爬来爬去");
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("小猫");
Polatouche polatouche = new Polatouche();
polatouche.setName("飞鼠");
cat.running();
polatouche.flying();
polatouche.running();
}
}
在使用一个类实现多个接口时,应将每个接口的抽象方法全部实现,否则需要把该类设置为抽象类,同时在实现多个接口的同时,还可以继承一个父类。
继承表达的含义is-a,
接口表示的含义是具有xxx特性。
有了接口后,我们使用类时就不必去关注具体类型,只需要去关注某个类是否具备某种能力。
接口间的继承
在Java中接口之间是可以继承,而且相对于类与类之间的单继承,接口是可以进行多继承的,我们可以使用接口来达到多继承的目的,接口之间继承就相当于把多个接口合并在一起
public interface Swim {
void swimming();
}
public interface Amphibious extends Run,Swim{
}
五、抽象类和接口的区别
抽象类和接口都是Java中多态的常见使用方式,
其中抽象类中可以包含普通方法,普通字段,而接口中不能包含普通方法,子类必须重写所有的抽象方法。
抽象方法的存在是为了让编译器更好的校验。抽象类可以有各种权限,而接口只有public权限