JavaSE第三章 面向对象 接口 interface

3.6 接口

3.6.1 定义

官方解释是一系列方法特征的集合, 在jdk1.8之前可以理解为一个纯粹的抽象类, 只包含静态常量和方法的定义, 没有方法的实现.

  • 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。
  • 一个接口就是描述一种能力
    • 比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作.
    • 例如java中的接口Comparator, 这个接口代表“进行比较”的能力, 所以任何实现这个接口的类都具备了比较的能力, 可以用来进行排序操作.

3.6.2 作用

  1. java中没有多继承, 所以可以用接口实现多继承的逻辑.
  2. 实现解耦.

3.6.3 接口语法

//接口定义的语法要用到interface关键字
//[修饰符] interface 接口名 {}
public interface Animal {
    
    

    //在接口中, 不能只声明变量,必须要初始化
    //接口中存在的变量, 一定是静态常量,默认被public static final修饰着
    int num = 10;
    public static final int count = 11;

    //接口方法 不能有方法体, 且子类必须实现该接口方法
    void eat();
//    public abstract void eat();

    //默认方法   可以有方法体, 子类可以选择性的实现默认方法   //public可省略
    public default void test1(){
    
    
        System.out.println("test1");
    }

    //静态方法    可以有方法体,  使用时必须用接口名调用     //public可省略
    public static void test2(){
    
    
        System.out.println("接口中的静态方法");
    }
}

3.6.4 接口特点

  1. 接口是隐式抽象, 声明时不必使用abstract关键字

    //隐式抽象  默认是由abstract修饰的
    public interface Animal{
          
          }
    //上边和下边,两者等价
    public abstract interface Animal {
          
          }
    
  2. 声明的方法也是隐式抽象

    //两者等价
    void eat();
    public abstract void eat();
    
  3. 接口中存在的变量, 一定是静态常量,默认被public static final修饰着

  4. 接口不能实例化对象, 但能声明引用(用于多态)

  5. 一个类只能继承一个父类, 但能实现多个接口.

  6. 接口能继承多个接口.

  7. 接口用来弥补类无法实现多继承的局限.

  8. 接口与实现类中存在多态关系

3.6.5 接口和抽象类的区别

  1. 接口中存在的属性都是静态常量, 抽象类中可以有普通的非final属性变量
  2. 接口中不能有构造方法, 抽象类中可以有构造方法.
  3. 接口不能包含静态方法.
  4. 共同点都不能用来创建对象.
接口 抽象类
接口中存在的属性都是静态常量 可以有普通的非final属性变量
接口中不能有构造方法 抽象类中可以有构造方法
接口不能包含静态方法. 抽象类可以包含任意种类的方法
都不能用来创建对象. 都不能用来创建对象.

3.6.6 面向接口编程

只关心类有哪些能力 , 不去关心具体的实现细节

现实生活中,当我们想用某个设备去读取或写入电脑中的数据时, 就不可避免的会用USB接口,将设备与电脑联系起来.

这样,我们就可以吧USB看做一个接口, 任何带有USB接口的设备都具有读和写的能力.

public interface USB {
    
    
    //该接口有两个能力, 分别是读和写
    //任何实现了该接口的类都具备了这两种能力
    //当然USB可能会有更多的能力,比如说充电等等
    void read();

    void write();
}

然后在制造U盘时, 实现这个接口

public class UPan implements USB{
    
    

    @Override
    public void read() {
    
    
        System.out.println("U盘正在使用USB接口的'读'能力");
    }

    @Override
    public void write() {
    
    
        System.out.println("U盘正在使用USB接口的'写'能力");
    }
}

测试

public static void main(String[] args) {
    
    
        UPan u = new UPan();
        u.read(); //U盘正在使用USB接口的'读'能力
        u.write();//U盘正在使用USB接口的'写'能力
    }

猜你喜欢

转载自blog.csdn.net/qq_37079157/article/details/109366441
今日推荐