java基础 之 接口

前言

前文回顾 戳这里→java基础 之 抽象类
因为接口是对抽象类的一种延伸,所以请先了解一下抽象类会更好的理解接口哦

子类对抽象类叫继承,使用关键字extends;
子类对接口叫实现,使用关键字implement;

jdk1.8以前,接口中的方法必须全部是抽象方法;jdk1.8之后可以使用default关键字来实现。
本文介绍是基于jdk1.8以前的

接口

浅浅理解下接口

  • 回顾抽象类

    1、是站在类的角度把共性抽离出来
    2、主要作用是用来当父类的
    3、目的是让代码共用的同时还能提升代码的灵活性
    4、有抽象方法和普通方法,但是不能实例化对象

  • 抽象类是不是就够用了呢?

    1、抽象类一种共性的抽离,那如果在抽象类中,只有抽象方法,那可以再抽离一下吗?
    2、有时候继承一个抽象类不足以满足当前对象的属性,怎么办?

    于是,我们引入了接口~~

抽象类与接口的爱恨情仇

  • 接口也是类

  • 接口就是抽象类抽象到了极致

    如果一个类是抽象类,且类中的所有方法都是抽象方法。那么类需要写abstract修饰,方法也写abstract修饰,为了减少代码量,我们可以把这个抽象类“抽象”成一个接口。

    也就是说,接口是抽象类的抽象类。
    接口用interface替代了类的abstract修饰和方法上的abstract修饰

  • 抽象类是个模板,接口就是个标准

    抽象类可以有自己的普通方法。接口中全部是抽象方法,没有方法体,可以理解为一个标准,具体实现需要子类去实现

  • 类只支持单继承,但是接口支持多实现

    java中类的继承只能是单继承:如果同时继承两个类,如果两个类有相同的非抽象方法(普通方法),子类就无法确定使用哪个父类的方法

    类对接口的实现,支持多实现:接口只是个标准,所有的方法都是没有方法体的。类去实现接口后,需要根据自己的业务逻辑去重写该方法。这样即使两个接口有相同的方法,重写后方法也是唯一的,没有冲突。

特点

  • 1、接口是一种特殊的类,使用的关键字是interface

  • 2、接口中所有的方法默认是public abstract修饰的(一般省略不写)

  • 3、接口中的所有成员变量都是有public static final修饰的

    接口可以认为是一个标准,标准就是公开(public)、共享(static)、不可变(final)的

  • 4、接口没有构造方法,可是使用多态

    构造方法是用来实例化对象的,接口不可以实例化对象

  • 5、实现接口的类必须要实现接口中所有方法。如果不想实现接口中的所有方法,那么该类设置成抽象类即可

  • 6、接口和接口之间可以继承,并且支持多继承;类与接口之间是实现关系,并且一个类可以多现实多个接口

  • 7、接口与实现类之间存在多态性

    我们定义一个接口Animal、Move 和 Eat
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    使用类的多态,如果是Animal的话,只能调用breath()和run()方法
    在这里插入图片描述

    使用类的多态:如果是Eat的话,只能调用eating()方法
    在这里插入图片描述

    使用类的多态:如果是Move的话,只能调用moving()方法
    在这里插入图片描述

接口的回调

  • 在接口没有实现前也可以调用

    即先有接口的使用者,再有接口的实现者

  • 实现一个接口回调

    1、创建一个usb接口,方法我们先只有一个service()
    2、定义接口的使用者Computer类,该类包含三个usb属性
    3、定义三个类 Key(键盘)、Mouse(鼠标)、Udisk(U盘)来实现Usb接口
    4、实例化Computer类

    /***
     * 创建一个usb接口,方法只有一个service
     */
    public interface Usb {
        void service();
    }
    
    /***
     * 定义接口的使用者Computer类
     */
    public class Computer {
        Usb usb1;
        Usb usb2;
        Usb usb3;
        
        public void run(){
            System.out.println("Computer 启动");
            if(usb1!=null){
                usb1.service();
            }
            if(usb2!=null){
                usb2.service();
            }
            if(usb3!=null){
                usb3.service();
            }
        }
    }
    
    /***
     * 定义Mouse类来实现Usb接口
     */
    public class Mouse implements Usb{
        @Override
        public void service() {
            System.out.println("鼠标启动");
        }
    }
    
    /***
     * 定义Key类来实现Usb接口
     */
    public class Key implements Usb{
        @Override
        public void service() {
            System.out.println("键盘启动");
        }
    }
    
    /***
     * 定义Udisk类来实现Usb接口
     */
    public class Udisk implements Usb{
        @Override
        public void service() {
            System.out.println("U盘启动");
        }
    }
    
    // 测试方法
    public class Test {
        public static void main(String[] args) {
            Computer computer = new Computer();
            computer.usb1 = new Key();
            computer.usb2 = new Mouse();
            computer.usb3 = new Udisk();
            computer.run();
        }
    }
    ----------------输出结果--------------------
    Computer 启动
    键盘启动
    鼠标启动
    U盘启动
    

抽象类和接口

相同之处

  • 接口和抽象类中都可以有静态代码块和静态方法、抽象方法和默认方法

    接口的默认方法是由default修饰,在jdk1.8以后使用

区别

  • 1、接口中的方法默认抽象方法,在接口中不能有实现;抽象类中的非抽象的方法可以有方法体
  • 2、接口中的成员变量默认是final修饰的;抽象类中的成员变量不一定
  • 3、一个类可以实现多个接口,但是最多只能继承一个抽象类
  • 4、一个类实现接口需要实现接口的所有方法,继承抽象类只需要实现抽象方法,非抽象方法不做要求
  • 5、从设计层面来看:抽象类是对类的抽象,是一种模板设计。而接口是行为的抽象,是一种行为的规范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值