定义
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
接口技术用于描述类具有什么功能,但并不给出具体实现,当某个类要使用接口时,再去实现接口中的这些方法。类需要遵从接口中描述的统一规则进行定义,所以,接口是对外提供的一组规则,标准。
一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
定义格式
interface 接口名{
}
注意:接口不是类,接口类的方法必须是抽象类方法
接口的使用格式
interface Inter{
}
class Zi implements Inter{
}
abstract Zi2 implements Inter{
}
特点
- 接口不能创建对象
- 一个类想要实现一个接口,要么该类是一个抽象类,要么该类是一个普通类,就必须重写接口中的所有的抽象方法
- 接口没有构造方法
接口的成员特点
成员变量
- 接口中的所有的变量全部都是自定义的常量 -- 不能修改
- 接口中的成员变量必须在定义的时候初始化
- 接口中的成员变量的默认修饰符为 public static final
- public 可以被继承的变量
- static 静态变量,所有类共同使用,并且只有一个值
- final 常量,不能修改值
interface Inter_1{
int i = 2;
}
class Zi_1 implements Inter_1{
}
public class Demo{
public static void main(String[] args){
Zi_1 zi = new Zi_1();
System.out.println(zi);
// zi.i = 3;//报错,不能修改变量值
}
}
成员方法
-
在JDK7.0版本及其之前版本中,接口中仅支持公有的抽象方法:
-
public abstract 返回值类型 方法名();
-
事实上,接口中的方法默认就是公有抽象方法,因此在接口中定义抽象方法时,可以省略掉abstract关键字。
-
-
从JDK8.0开始,接口中可以由默认方法和静态方法:
-
默认方法——public default 返回值类型 方法名() {}
-
静态方法——public static 返回值类型 方法名() {}
-
需要注意的是,想定义默认方法必须在前面添加default关键字,
- 因为接口中的方法如果你什么都不写,默认是公有的抽象的方法。
- 默认方法可以有方法体,且不需要实现类去实现,其实就是我们平时见到的普通的成员方法。但是默认方法是可以被实现类重写的。
- default关键字只能在接口中使用。就算实现类要重写默认方法,实现类中重写后的方法也不能添加default修饰符,不然IDEA报错。
-
-
JDK9.0以后,接口中可以有私有方法 :
- private 返回值类型 方法名() {}
构造方法
接口中没有构造方法
interface Inter_1{
}
class Zi extends Object implements Inter_1{
public Zi(){
super();// 调用的是父类的构造方法
}
}
接口与类之间的关系
类与类
继承关系,只能单继承,不能多继承
因为如果两个父类拥有同一个方法,子类对象在调用的时候无法确定是那一个父类的方法,会产生冲突,因此只能有一个父类,即单继承
类与接口
实现关系,支持单实现,也支持多实现
因为接口里的方法都是抽象方法,不管是哪一个接口里的方法都没有方法体,所以子类实现的时候一定会重写,因此子类可以有多个接口
interface Inter{
}
interface Inter_1{
}
class Zi implements Inter,Inter_1{
}
接口与接口
继承关系,支持单继承,也可以多继承
interface A{
public abstract void eat(){}
}
interface B{
}
interface C extends A,B{
public void eat(){
}
}
接口和类的使用范围
当两个类之间存在is关系,就要定义类,两个类之间是继承关系
接口是额外扩展的功能,本身该类不具备这个功能,而且不是is关系
abstract class Animal{
public abstract void eat(); // 小动物需要吃饭,但是吃的的食物可能不同
// 所以需要该属性,但是不需要方法体
public void drink(){
System.out.println("喝水"); // 小动物需要喝水,而且喝的都是水
}
}
interface Swim{ // 游泳只是一个额外功能,所以可以定义为接口
public abstract void swimming();
}
// 狗是动物,所以是继承关系
// 不是所有动物都会游泳,所以是额外关系
class Dog extends Animal implements Swim{
public abstract void eat(){
System.out.println("吃骨头");
}
public void play(){
System.out.printl("玩球");
}
public void swimming(){
System.out.println("狗刨");
}
}
// 狗是动物,所以是继承关系
class Cat extends Animal{
public abstract void eat(){
System.out.println("吃鱼");
}
public void play(){
System.out.printl("玩逗猫棒");
}
}