Java中的接口

一、Java接口的概述:

Java的接口(interface)是一个由抽象方法和常量值的定义的集合。

接口无法被实例化,实现接口子类必须的重写接口中的所有抽象方法,否则这个类要被声明为抽象类

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是。。则只能。。”的思想。

接口的本质就是契约,制定好后必须遵守相关的规范。

面向对象的精髓就是对对象的抽象化,而Java中最能体现这一点的就是接口。这也是为什么我们讨论设计模式都只针对具备了抽象能力的语言(C++, Java, C# 等),就是因为设计模式所研究的,实际上就是如何合理的抽象化。

二、接口的声明:

修饰符 interface 接口名称 {
    //声明变量
    //声明抽象方法
}

示例:

package com.zctou.oop.demo11;

public interface UserService {
    //接口演示
    //接口关键字 interface
    //接口的属性 默认为 public static final,是常量,要赋初值
    int age=99 ;
    //接口中方法的默认修饰符为 public abstract
    //增删改查
    void add (String name);
    void delete(String name);
    void update(String name);
    void query(String name);

    static void eat(){
        System.out.println("UserService接口用static实现方法~");
    }
    default void shout() {
        System.out.println("UserService接口用default实现方法");
    }
}

1、接口的声明的关键字是interface,所有的接口都是抽象的。

2、接口中声明的变量都是常量,必须赋值,默认隐式定义为public static final

3、接口中声明的方法都为抽象方法,且不能为实体。默认隐式定义为public abstract

4、JDK1.8后,接口中新增了两种情况可以有方法体的定义:

  • A:带仅static修饰符的方法,如:

    static void eat(){
        System.out.println("UserService接口用static实现方法~");
    }
  • B: 仅带default修饰符的方法,如:

    default void shout() {
        System.out.println("UserService接口用default实现方法");
    }

两种方法都默认是public,且都可以带方法体defaultstatic关键字相当于给了接口提供一个默认实现方法的权限,让子类可以不重写这个方法。

三、接口的实现:

实现接口的类不能称之为继承接口,只是用于实现接口中的抽象方法。当一个类要实现接口时,必须重写接口中的所有抽象方法(没被实现的方法),否则这个类要被声明为抽象类。

实现接口的关键字是 implements,其语法格式如下:

修饰符 class 类名 implements 接口名称{}

如:

public class UserServiceImpl implements UserService{
    //具体类的方法及属性
}
implements放在class和类名后。

如果实现接口的类没用实现接口的抽象方法,那么这个类只能声明为抽象类。同理,如果实现接口的类被声明为抽象类,这个类就没必要去实现接口的抽象方法。

类在实现接口的方法时,不能抛出强制性异常,强制性异常只能在接口或继承接口的类中抛出。

四、接口的继承:

和类的继承类似,接口也可以继承接口,使用关键字extends,子接口继承父接口的方法。

方法格式:

修饰符 interface 子接口名 extends 父接口名 {
    //子类抽象方法
}

示例:

public interface PrimaryUserService extends UserService{ //继承父接口 UserService
    void primaryUsersAccounts();
}

这样,子接口 PrimaryUserService就比父接口多了一个方法,加上继承父接口的抽象方法6个,一个类要实现PrimaryUserService,就要重写7个抽象方法。

五、接口的多继承:

前面多次提到,Java的类只有单继承,没有多继承,Java中类的多继承是不合法的。便接口不一样,接口允许多继承的。利用接口的多继承特点,还可以间接性的实现类的多继承(接口实现类的伪多继承)。

接口多继承的语法:

修饰符 interface 子接口名 extends 接口名[,接口名2,接口名3...] {}

如:

public interface PrimaryUserService extends UserService,Timer{
    void primaryUsersAccounts();
}
接口可以多继承,且这些继承之间不必在于关系链(父子关系),接口可以任意继承接口,同时接口也可以被任意接口继承,也就是说继承和被继承的接口都没任何关系要求。

实现类的多继承

语法格式:

修饰符 class 类名 implements 接口1,接口2,接口3... {
}

如:

public class UserServiceImpl implements PrimaryUserService,Timer{
    //重写所有接口的方法
}

六、接口、类、抽象类的区别

  • 普通类:没有抽象类,只有具体的实现,声明类的关键字: class
  • 抽象类:既有具体实现,也有抽象方法(约束),声明抽象类的关键字: abstract class
  • 接口:只有规范(约束),JDK1.8后 添加staticdefault两种可以有方法体的方法。声明接口的关键字:interface
  • 继承与实现

    • 继承:抽象类和接口的关键字都是extends
    • 实现:

      • 实现抽象类关键字: extends
      • 实现接口的关键字是:implements
文章目录