• 接口的详解


       接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

    一、语法规则

            接口的定义格式与定义类的格式基本相同,将class关键字换成interface关键字,就定义了一个接口

    1. //接口是一个公共标准,是规范,因此接口中的方法在定义的时候都不给方法体,接口里的方法全是抽象方法
    2. public interface IUSB {
    3. void openUSB();
    4. void closeUSB();
    5. }

    注意:

        1、创建接口时,接口的命名一般以大写字母I开头

        2、接口的命名一般使用“形容词”词性的单词

        3、阿里编码规范中规定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性

    二、接口的使用

       接口不能直接使用,必须要有一个“实现类”来“实现”该接口,实现接口中所有的抽象方法

    1. public class 类名称 implements 接口名称{
    2. ......
    3. }

    注意:子类和父类是extends继承关系,类与接口之间是implements实现关系

    以下举一个笔记本电脑使用USB鼠标和USB键盘的例子: 

    1. //接口是一个公共标准,是规范,因此接口中的方法在定义的时候都不给方法体,接口里的方法全是抽象方法
    2. public interface IUSB {
    3. void openUSB();
    4. void closeUSB();
    5. }
    1. public class Mouse implements IUSB{
    2. @Override
    3. public void openUSB() {
    4. System.out.println("打开鼠标");
    5. }
    6. @Override
    7. public void closeUSB() {
    8. System.out.println("关闭鼠标");
    9. }
    10. public void click(){
    11. System.out.println("点击鼠标");
    12. }
    13. }
    1. public class KeyBoard implements IUSB{
    2. @Override
    3. public void openUSB() {
    4. System.out.println("打开键盘");
    5. }
    6. @Override
    7. public void closeUSB() {
    8. System.out.println("关闭键盘");
    9. }
    10. public void input(){
    11. System.out.println("通过键盘输入");
    12. }
    13. }
    1. public class Computer {
    2. public void powerOn(){
    3. System.out.println("电脑开机");
    4. }
    5. public void powerOff(){
    6. System.out.println("电脑关机");
    7. }
    8. public void useUSB(IUSB usb){
    9. usb.openUSB();
    10. if(usb instanceof Mouse){
    11. Mouse mouse = (Mouse)usb;
    12. mouse.click();
    13. } else if(usb instanceof KeyBoard){
    14. KeyBoard keyBoard = (KeyBoard)usb;
    15. keyBoard.input();
    16. }
    17. usb.closeUSB();
    18. }
    19. }
    1. public class TestComputer {
    2. public static void main(String[] args) {
    3. //注意:接口的引用可以指向任意实现该接口的对象,接口的引用可以指向不同实现类的对象,因此就可以实现多态
    4. IUSB use = new Mouse();
    5. use = new KeyBoard();
    6. Computer computer = new Computer();
    7. computer.powerOn();
    8. computer.useUSB(new Mouse());
    9. computer.useUSB(new KeyBoard());
    10. computer.powerOff();
    11. }
    12. }

    输出结果为:

    三、接口特性

         1、接口类型是一种引用类型,但是不能直接new接口的对象

         2、接口中的每个方法都是public的抽象方法,即接口中的方法会被隐式的指定为public abstract,其他修饰符都会报错

         3、接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

         4、重写接口中的方法时,不能使用default访问权限修饰

         5、接口中可以含有变量,但是变量会被隐式指定为public static final变量

         6、接口中不能有静态代码块、实例代码块和构造方法

             接口中不能有实例代码块和构造方法:实例代码块中的内容经过编译后,按照其在类中声明的次序,需要依次加载到构造方法的前面,而构造方法的作用是初始化对象,给对象的普通的成员变量一个合适的初始值,因此构造方法肯定有自己的实现体,即构造方法不能是抽象方法,因为矛盾

          7、接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class

          8、如果类没有实现接口类中的所有方法,则类必须设置为抽象类

          9、在jdk8:接口中还可以包含default方法,可以在不影响接口的实现类的前提下为接口添加新的功能特性,通过在接口定义的方法的访问修饰符前面加上default,那么接口的实现类可以不用实现该方法

    四、实现多个接口

         Java中不支持单继承,但是一个类可以实现多个接口

     以下代码加深理解:

    1. public interface IRunning {
    2. void run();
    3. }
    1. public interface ISwimming {
    2. void swim();
    3. }
    1. public interface IFlying {
    2. void fly();
    3. }
    1. public interface IAmphibious extends IRunning,ISwimming{
    2. //在Java中一个接口可以去继承多个接口
    3. }
    1. public abstract class Animal {
    2. public String name;
    3. public String gender;
    4. public int age;
    5. //所有的动物都需要吃饭睡觉,这是动物的公共方法
    6. public abstract void eat();
    7. public abstract void sleep();
    8. }
    1. public class Dog extends Animal implements IRunning,ISwimming{
    2. @Override
    3. public void eat() {
    4. System.out.println(name + "吃骨头");
    5. }
    6. @Override
    7. public void sleep() {
    8. System.out.println(name + "睡觉呼呼呼");
    9. }
    10. @Override
    11. public void run() {
    12. System.out.println(name + "用四个蹄子跑");
    13. }
    14. @Override
    15. public void swim() {
    16. System.out.println(name + "狗刨游泳");
    17. }
    18. }
    1. public class Frog implements IAmphibious{//青蛙是两栖动物
    2. @Override
    3. public void run() {
    4. System.out.println("会跑");
    5. }
    6. @Override
    7. public void swim() {
    8. System.out.println("会游泳");
    9. }
    10. }

    注:类和类之间是extends继承关系,而且是单继承

           类和接口之间是implements实现关系,而且一个类可以实现多个接口

           接口和接口之间是extends关系,一个接口可以继承多个接口

  • 相关阅读:
    阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
    java牛客笔试题练习日记 - java基础篇
    LHS RHS
    苹果app开发流程详解​
    Python创建/写文件
    卵清蛋白壳聚糖纳米粒的制备,OVA-CS纳米粒
    从火山引擎新品发布会,看字节的数据飞轮如何转起来?
    Redis主从复制+哨兵模式
    [swift刷题模板] 树状数组(BIT/FenwickTree)
    [C++] 超详细分析 C++内存分布、管理(new - delete) ~ C 和 C++ 内存管理关系 ~ 内存泄漏 ~
  • 原文地址:https://blog.csdn.net/m0_53677355/article/details/126789409