接口
文章目录
一、接口
在Java中,接口不是类,而是对希望符合这个接口的类的一组需求。
比如我们可以将Java中的接口可以类比为电脑中的USB接口,USB接口规定了可插接的设备的通用规格,类似于接口中定义的方法;
任何设备只要符合USB接口的规定,就可以插接到计算机上使用,类似于类实现接口,比如可以将键盘,鼠标通过USB接口连进行连接;
而USB接口主机可以同时连接多个不同类型的设备,这也类似于一台计算机可以调用多种实现了接口的类;
因此,Java中的接口与USB接口一样,提供了一种标准化、通用的接口,实现了不同类之间的互相调用和协作。
二、接口详解
1.接口的语法规则
接口的定义格式与类的定义格式基本相同,只要将class关键字换成interface关键字即可
public interface InterfaceName {
//常量
double SPEED_LIMIT = 95;
// 声明方法
public abstract void method1();
public void method2();
abstract void method3();
void method4();
}
1.接口中不能包含实例字段,但是可以包含常量,但是常量默认都是public static final
2.在接口中,方法默认是 public 和 abstract 的(在 Java 8 之后,也可以定义默认方法和静态方法),上面的四种方法的写法都是抽象方法,但是更推荐方法4
提示:
- 创建接口时, 接口的命名一般以大写字母 I 开头.
- 接口的命名一般使用 “形容词” 词性的单词.
- 接口中的方法和属性最好不要加任何修饰符号, 为了保持代码的简洁性.
2.接口的使用
1.接口不是类,不能使用new直接实例化一个接口,而是必须要有一个"实现类"来"实现"接口,实现接口中的抽象方法(子类和父类是extends继承关系,而接口和类是implements关系)
public class ClassName implements InterfaceName {
// 实现接口方法
}
2.示例代码
public interface Shape {
// 常量定义
double PI = 3.1415926;
// 抽象方法定义
double getArea();
double getPerimeter();
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return PI * radius * radius;
}
public double getPerimeter() {
return 2 * PI * radius;
}
}
a.这个接口定义了两个常量PI、以及两个抽象方法getArea()和getPerimeter()。实现该接口的类必须实现这两个方法,并且返回值类型和参数类型必须和接口定义的一致。
b.这个类实现了Shape接口,并提供了getArea()和getPerimeter()方法的具体实现。
3.接口的特性
1.接口类型是一种引用类型,但是不能直接new接口对象
public class Test{
public static void main(String[] args){
Shape shape = new Shape();
}
}
//Error
//Shape是抽象的,无法实例化
2.接口中的方法是public的抽象方法,默认修饰是public abstract,接口中不能包含实例字段,但是可以包含常量,但是常量默认都是public static final
3.接口中的方法不在接口中实现,而是利用实现接口的类来实现
4. 重写接口中方法时,不能使用default访问权限修饰
5. 接口中不能有静态代码块和构造方法(在 Java 8 之后,也可以定义默认方法和静态方法)
6. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
7. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
4.实现多个接口
Java中只支持单继承,不支持多继承,为了解决这个问题,从而推出了接口,一个类可以实现多个接口
1.语法格式
class MyClass implements Interface1, Interface2, Interface3 {
// 实现接口的具体方法
}
MyClass类实现了三个接口Interface1、Interface2、Interface3,需要在类名后使用implements关键字,接口之间使用逗号分隔
2.注意点
a.实现的多个接口中不能有同名的默认方法(Java 8及以上版本支持默认方法),否则会导致编译错误
b.如果多个接口中有同名的抽象方法,那么在实现类中只需要实现一次即可
c.如果多个接口中有同名的常量,那么在实现类中只需要使用其中一个即可
d.一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类
IDEA 中使用 ctrl + i 快速实现接口
3.示例代码
interface Interface1 {
public void method1();
}
interface Interface2 {
public void method2();
}
interface Interface3 {
public void method3();
}
class MyClass implements Interface1, Interface2, Interface3 {
public void method1() {
System.out.println("Method1");
}
public void method2() {
System.out.println("Method2");
}
public void method3() {
System.out.println("Method3");
}
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.method1();
obj.method2();
obj.method3();
}
}
这个示例代码中,MyClass实现了三个接口Interface1、Interface2、Interface3,并分别实现了这三个接口中的方法。在main函数中,我们创建了一个MyClass对象,并调用了它实现的三个方法。
三、接口与继承
1.联系:
1.继承和接口都可以用来实现代码复用和多态性。
2.子类继承父类时,可以继承父类的属性和方法;实现接口时,需要实现接口中定义的所有方法,从而实现接口的规范。
3.继承和接口都可以实现多态性,子类可以覆盖父类的方法,实现不同的行为;实现接口的类也可以根据自己的需要实现接口中的方法,实现不同的行为。
2.区别:
1.继承是一个类与另一个类之间的关系,而接口是类与类之间的一种契约关系。
2.继承可以继承父类的属性和方法,而接口只能定义方法和常量,不能包含属性。
3.一个类只能继承一个父类,但是可以实现多个接口。
4.继承中的子类与父类之间存在is-a(是一种)的关系,而接口中的实现类与接口之间存在has-a(有一个)即有一个特性的关系。
5.继承中的子类可以直接访问父类的属性和方法,而实现接口的类必须实现接口中所有的方法。
总的来说,上面文字中的最重要的一句话是:
继承表达是is-a的关系,而接口表示的是has-a的关系
以动物为例
狗是一种动物,具有跑步的特性
鸭子是一种动物,不仅会跑,还会游泳
四、接口间的继承
1.接口可以进行继承,利用extends来继承,
语法格式如下:
interface SubInterface extends SuperInterface {
// 子接口的方法定义
}
SubInterface是子接口,SuperInterface是父接口,使用extends关键字进行继承。子接口可以继承多个父接口,使用逗号分隔
2.示例代码
interface Animal {
void eat();
}
interface Bird extends Animal {
void fly();
}
class Sparrow implements Bird {
public void eat() {
System.out.println("Sparrow is eating");
}
public void fly() {
System.out.println("Sparrow is flying");
}
}
public class Main {
public static void main(String[] args) {
Sparrow sparrow = new Sparrow();
sparrow.eat();
sparrow.fly();
}
}
在代码中,Animal是一个父接口,Bird是一个子接口,Sparrow实现了Bird接口,并实现了eat()和fly()方法。在main函数中,我们创建了一个Sparrow对象,并调用了它实现的两个方法
总结
Java中的接口是一种特殊的抽象类,它只包含常量和抽象方法的定义,没有任何具体实现,简单而言,接口是多个类的公共规范,是一种引用数据类型。