11 Java接口(语法、规范、微观&宏观接口)

简介: 11 Java接口(语法、规范、微观&宏观接口)

11.1 接口语法

11.1.1 基本使用

概念:接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似。使用interface关键字定义接口。

特点:

  • 没有构造方法,不能创建对象。
  • 只能定义:公开静态常量、公开抽象方法。

案例演示:自定义接口。

public interface MyInterface {  
  //接口中:只能定义公开的静态常量和公开抽象方法
  //       没有构造方法、动态、静态代码块
  public static final int a = 10;
  public abstract void show();
}


11.1.2 和抽象类区别

相同点:

  • 可编译成字节码文件。
  • 不能创建对象。
  • 可以作为引用类型。
  • 具备Object类中所定义的方法。

不同点:

  • 所有属性都是公开静态常量,隐式使用public static final修饰。
  • 所有方法都是公开抽象方法,隐式使用public abstract修饰。
  • 没有构造方法、动态代码块、静态代码块。

11.2 微观接口

微观概念:接口是一种能力和约定。

  • 接口的定义:代表了某种能力。
  • 方法的定义:能力的具体要求。

经验:

  • Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。
  • 接口支持多实现,可为类扩充多种能力。

案例演示:实现类实现多个接口。

public interface Flyable {
  void fly();
}

public interface Fireable {
  void fire();
}

实现类:Person

public class Person implements Flyable,Fireable{
  String name;
  int age;
  public Person() {
    // TODO Auto-generated constructor stub
  }
  
  public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
  }

  public void eat() {
    System.out.println(name+"吃东西...");
  }
  public void sleep() {
    System.out.println(name+"睡了...");
  }
  @Override
  public void fly() {
    System.out.println(name+"开始飞了...");
  }

  @Override
  public void fire() {
    System.out.println(name+"可以喷火了...");
  }
}

测试类:

public class TestPerson1 {
  public static void main(String[] args) {
    Person xiaoming=new Person("小明",20);
    xiaoming.fly();
    xiaoming.fire();
    
  }
}

11.3 接口规范

  • 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。
  • 实现接口中的抽象方法时,访问修饰符必须是public。
  • 同父类一样,接口也可声明为引用,并指向实现类对象。
public class TestPerson2 {
  public static void main(String[] args) {
    
    Flyable flyable=new Person("小张",22);
    flyable.fly();


    Fireable fireable=new Person("小李", 15);
    fireable.fire();
  }
}


11.4 接口实现多态

不同的引用类型,仅可调用自身类型所定义的方法。

案例演示:

public class Test {
  public static void main(String[] args) {
    //抽象类作为引用
    Animal a = new Dog();//将狗当做动物看
    a.eat();
    a.sleep();
    
    //接口作为引用   
    Runnable r = new Dog();//将狗当做能跑的看
    r.run();
    
    //接口作为引用   
    Swimmable s = new Dog();//将狗当做能游泳的看
    s.siwm();
    
    Dog dog = new Dog();//将狗当做狗的看
    dog.eat();
    dog.sleep();
    dog.run();
    dog.siwm();
  }
}

11.5 接口常见关系

类与类:

  • 单继承
  • extends 父类名称

类与接口:

  • 多实现
  • implements 接口名称1 , 接口名称2 , 接口名称n
  • implements 接口名称1 , 接口名称2 , 接口名称n

接口与接口:

  • 多继承
  • extends 父接口1 , 父接口2 , 父接口n

案例演示:接口多继承

public interface Runnable extends Serializable ,Cloneable{
  //跑
    void run();
}

11.6 常量接口

将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统一管理,提高代码可读性。

补充 标记接口接口没有任何成员,仅仅是一个标记。Serializable、Cloneable

public interface Constants {
  //QQ的状态    接口常量 --- > 枚举类型
  public static final int ZAI_XIAN = 100; //在线
  public static final int YIN_SHEN = 200; //隐身
  public static final int LI_XIAN = 300;  //离线
  public static final int Q_WO = 400;     //Q我
  public static final int MANG_LU = 500;  //忙碌
}
int num = 100;
switch (num) {
    case Constants.ZAI_XIAN:
        System.out.println("在线的代码");
        break;
    case Constants.YIN_SHEN:
        System.out.println("隐身的代码");
        break;
    case Constants.LI_XIAN:
        System.out.println("离线的代码");
        break;
    default:
        break;
}

11.7 宏观接口

11.7.1 概念

宏观概念:接口是一种标准、规范。

案例演示:

public interface BookInterface {
  /**
   * 增删改查
   */
  public boolean addBook(Book book);
  
  public boolean updateBook(Book book);
  
  public boolean deleteBook(String bookId);
  
  public Book selectOne(String bookId);
  
  public Book[] selectAll();
}
public class BookInterfaceImpl implements BookInterface{
  
  @Override
  public boolean addBook(Book book) {
        return false;
  }
  @Override
  public boolean updateBook(Book book) {
    // TODO Auto-generated method stub
    return false;
  }
  @Override
  public boolean deleteBook(String bookId) {
    // TODO Auto-generated method stub
    return false;
  }
  @Override
  public Book selectOne(String bookId) {
    // TODO Auto-generated method stub
    return null;
  }
  @Override
  public Book[] selectAll() {
    // TODO Auto-generated method stub
    return null;
  }
}
11.7.2 回调原理

接口回调:先有接口的使用者,后有接口的实现者。

(程序员) (接口的使用者)

④工具的调用者---------→→→> ②工具

③接口的实现者 <-←←------------ ①接口

(程序员) (标准)


①接口

//此接口的作用是判断数字是否是质数
interface MyInterface{
  boolean isZS(int num);
}

②工具

//此方法已经调用了接口中的方法
public static void gdbh(int num,MyInterface mi) {
    for (int i = 3; i <= num/2; i++) {
        if(mi.isZS(i) && mi.isZS(num-i)) {
            System.out.println(num+"="+i+"+"+(num-i));
        }
    }
}

③接口的实现者

//这是接口的实现者,在调用工具前,需要有接口的实现
class MyInterfaceImpl implements MyInterface{
  @Override
  public boolean isZS(int num) {
    for (int i = 2; i < num; i++) {
      if(num % i == 0) {
        return false;
      }
    }
    return true;
  }
} 

④工具的调用者

public static void main(String[] args) {
    //使用工具
    gdbl(14, new MyInterfaceImpl() );
}

接口回调的编码顺序①②③④

11.7.3 接口好处
  • 程序的耦合度降低。
  • 更自然的使用多态。
  • 设计与实现完全分离。
  • 更容易搭建程序框架。
  • 更容易更换具体实现。

补充面向对象的七大设计原则

  1. 总则:开闭原则(Open Close Principle,OCP)
  • 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。

2.单一职责原则(Single Responsibility Principle,SRP)

  • 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

3.里氏替换原则(Liskov Substitution Principle,LSP)

里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

4.依赖倒置原则(Dependence Inversion Principle,DIP)

面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

5.接口隔离原则(Interface Segregation Principle,ISP)

每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

6.迪米特法则(最少知道原则)(Demeter Principle,DP)

一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。

只和朋友通信,不和陌生人说话。

7.合成/聚合复用原则(Composite Reuse Principle,CRP)

原则是尽量首先使用合成/聚合的方式,而不是使用继承。

8.开口里合最单依

接口小结:

  1. 什么是接口:
  1. 微观:接口是一种能力和约定。
  2. 宏观:接口是一种标准。
  1. 接口的特点:
  1. 没有构造方法,不能创建对象,可以声明变量。
  2. 只能包含公开静态常量与公开抽象方法。
  1. 接口的规范
  1. 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。
  2. 实现接口中的抽象方法时,访问修饰符必须是public。
  1. 什么是常量接口、标记接口
  1. 将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统一管理。
  1. 什么是接口回调
  1. 先有接口的使用者,后有接口的实现者。
  1. 面向对象七大设计原则

目录
相关文章
|
4天前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
12 5
Java——抽象类和接口
|
4天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
12 4
Java——接口的使用实例
|
13天前
|
缓存 算法 Java
【Java引用规范】强软引用
本文详细介绍了Java中引用的概念和作用,包括强引用、软引用、弱引用和虚引用,并探讨了不同引用类型在内存管理和垃圾回收中的特性与用途。强引用是最常见的引用类型,对象只要被引用就不会被垃圾回收;软引用适用于内存敏感的缓存场景,在内存不足时会被回收;弱引用在更早的垃圾回收阶段被清除;虚引用主要用于对象的finalize过程。文章通过示例代码和内存分析工具展示了软引用的具体应用和回收机制。
【Java引用规范】强软引用
|
10天前
|
Java 数据库连接 数据库
Java服务提供接口(SPI)的设计与应用剖析
Java SPI提供了一种优雅的服务扩展和动态加载机制,使得Java应用程序可以轻松地扩展功能和替换组件。通过合理的设计与应用,SPI可以大大增强Java应用的灵活性和可扩展性。
42 18
|
8天前
|
Java 开发者
Java的接口详解
Java接口是编程中的一种重要特性,用于定义方法签名而不提供具体实现,作为类之间的契约,使不同类能以统一方式交互。接口使用`interface`关键字定义,可包含方法声明和常量。类通过`implements`关键字实现接口,并可同时实现多个接口,解决多重继承问题。接口中的方法默认为抽象方法,变量默认为`public static final`。Java 8引入了默认方法和静态方法,增强接口功能。接口广泛应用于回调机制和多态性实现,有助于构建更灵活和可维护的代码结构。
|
12天前
|
存储 Java 容器
Java 基础语法
Java是一种面向对象的编程语言,其基础语法包括类和对象、方法、变量、控制流语句、继承和多态以及异常处理。代码需写在类中,`main()`方法是程序入口,变量用于存储数据,控制流语句控制程序执行流程,继承和多态增强代码灵活性,异常处理保证程序稳定性。掌握这些知识可帮助您编写简单的Java程序。
|
12天前
|
Java API 开发者
Java 注释规范
Java中的注释规范包括单行注释(`//`)、多行注释(`/* ... */`)和文档注释(`/** ... */`)。单行注释适用于简短说明,多行注释用于较长描述,文档注释则专为自动生成API文档设计。注释应清晰明了、及时更新,避免冗余,并详细说明参数和返回值。遵循这些规范有助于提高代码的可读性和可维护性。
|
16天前
|
安全 前端开发 Java
浅析JVM invokedynamic指令与Java Lambda语法的深度融合
在Java的演进历程中,Lambda表达式无疑是Java 8引入的一项革命性特性,它极大地简化了函数式编程在Java中的应用,使得代码更加简洁、易于阅读和维护。而这一切的背后,JVM的invokedynamic指令功不可没。本文将深入探讨invokedynamic指令的工作原理及其与Java Lambda语法的紧密联系,带您领略这一技术背后的奥秘。
13 1
|
18天前
|
Java
盘点java8 stream中隐藏的函数式接口
`shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住感动瞬间。本文介绍了函数式接口的概念及其在Java中的应用,包括`Comparator`、`Runnable`、`Callable`等常见接口,并详细讲解了`Function`、`Predicate`、`Consumer`、`Supplier`和`Comparator`等函数式接口的使用方法及应用场景,展示了如何利用这些接口简化代码并提高编程效率。**个人IP:shigen**,与shigen一起,每天进步一点点!
29 0
盘点java8 stream中隐藏的函数式接口
|
存储 算法 Java
Java8语法最佳实践-什么是对象(上)
计算机革命起源机器。编程语言就像是那台机器。它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分。语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作。编程语言就是创建应用程序的思想结构。
155 0
Java8语法最佳实践-什么是对象(上)