第十章 接口

接口和抽象类提供了一种将接口与实现分离的更加结构化的方法。

抽象类和方法

包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,那么类本身也必须限定为抽象的,否则,编译器会报错。

可以将一个不包含任何抽象方法的类指明为 abstract,阻止创建类的对象。

抽象方法默认为包访问权限。

接口创建

一个接口表示:所有实现了该接口的类看起来都像这样。因此,任何使用某特定接口的代码都知道可以调用该接口的哪些方法,而且仅需知道这些。所以,接口被用来建立类之间的协议

Java 8 中接口稍微有些变化,因为 Java 8 允许接口包含默认方法和静态方法

接口与抽象类最明显的区别可能就是使用上的惯用方式。接口的典型使用是代表一个类的类型或一个形容词,如 Runnable 或 Serializable,而抽象类通常是类层次结构的一部分或一件事物的类型,如 String 或 ActionHero。

接口同样可以包含属性,这些属性被隐式指明为 static 和 final。

接口中的方法默认为 public

默认方法

关键字 default 允许在接口中提供方法实现——在 Java 8 之前被禁止。

增加默认方法的极具说服力的理由是它允许在不破坏已使用接口的代码的情况下,在接口中增加新的方法

多继承

当实现的两个接口中有相同的默认实现方法签名时,编译器会报错。可以通过覆写冲突的方法。

interface Jim1 {default void jim() {System.out.println("Jim1::jim");}
}interface Jim2 {default void jim() {System.out.println("Jim2::jim");}
}public class Jim implements Jim1, Jim2 {@Overridepublic void jim() {Jim2.super.jim();}public static void main(String[] args) {new Jim().jim();}
}

接口中的静态方法

Java 8 允许在接口中添加静态方法。这么做能恰当地把工具功能置于接口中,从而操作接口,或者成为通用的工具。

抽象类和接口

特性 接口 抽象类
组合 新类可以组合多个接口 只能继承单一抽象类
状态 不能包含属性(除了静态属性,不支持对象状态) 可以包含属性,非抽象方法可能引用这些属性
默认方法 和 抽象方法 不需要在子类中实现默认方法。默认方法可以引用其他接口的方法 必须在子类中实现抽象方法
构造器 没有构造器 可以有构造器
可见性 隐式 public 可以是 protected 或包访问权限

有一条实际经验:尽可能地抽象。因此,更倾向使用接口而不是抽象类。只有当必要时才使用抽象类。除非必须使用,否则不要用接口和抽象类。大多数时候,普通类已经做得很好,如果不行的话,再移动到接口或抽象类中。

完全解耦

可以在接口中定义 main() 方法。

多接口结合

可以有任意多个接口,并可以向上转型为每个接口,因为每个接口都是独立的类型。

使用接口的核心原因之一:为了能够向上转型为多个基类型。

使用接口的第二个原因与使用抽象基类相同:防止客户端程序员创建这个类的对象,确保这仅仅只是一个接口。

如果创建不带任何方法定义或成员变量的基类,就选择接口而不是抽象类。事实上,如果知道某事物是一个基类,可以考虑用接口实现它。

使用继承扩展接口

interface Vampire extends DangerousMonster, Lethal {void drinkBlood();
}

接口字段

因为接口中的字段都自动是 static 和 final 的,所以接口就成为了创建一组常量的方便的工具。自 Java 5 开始,我们有了更加强大和灵活的关键字 enum,那么在接口中定义常量组就显得没什么意义了

这些字段不是接口的一部分,它们的值被存储在接口的静态存储区域中。

接口嵌套

接口可以嵌套在类或其他接口中。

嵌套在类中的接口可以是private的。
实现 private 嵌套接口是一种可以强制该接口中的方法定义不会添加任何类型信息(即不可以向上转型)的方式。

嵌套在另一个接口中的接口自动就是 public 的,不能指明为 private。

接口和工厂方法模式

接口是多实现的途径,而生成符合某个接口的对象的典型方式是工厂方法设计模式。

本章小结

恰当的原则是优先使用类而不是接口。从类开始,如果使用接口的必要性变得很明确,那么就重构。接口是一个伟大的工具,但它们容易被滥用。

转载于:https://www.cnblogs.com/huangwenjie/p/11381924.html

20190820 On Java8 第十章 接口相关推荐

  1. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  2. idea重写接口没有@override_乐字节|Java8核心实战-接口默认方法

    JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...

  3. Java8新特性-接口中的静态方法与默认方法

    今天上午在读<Effective Java>时,有这样一句话:"接口中"不能有静态方法,于是联想起面试时老是被问接口相关的东西,决定总结一下,谁知道这一总结,就发现了自 ...

  4. 20190920 On Java8 第二十章 泛型

    第二十章 泛型 多态的泛化机制: 将方法的参数类型设为基类: 方法以接口而不是类作为参数: 使用泛型: 泛型实现了参数化类型 简单泛型 Java 泛型的核心概念:你只需告诉编译器要使用什么类型,剩下的 ...

  5. 紧随时代的步伐--Java8特性之接口默认方法

    1.关于Java8 自从1996年Sun公司发布Java以来,Java到目前为止已经走过21个年头,每一次的升级,都是Java语言的革新,对时代发展的适应.2014年Oracle发布Java8,而据可 ...

  6. 【Java8】函数式接口

    一.前言 早期的程序员在JDK1.5时期,掌握泛型.枚举.反射 基本上就可以了,随着JDK不断迭代升级,到相对于稳定的JDK1.8版本,扩展了大量的知识点,例如:lambda表达式,链式编程,函数式接 ...

  7. java8 四大函数式接口 和 用于数据处理的 stream流 使用详解

    文章目录 Stream 使用示例 四大函数式接口 Function 功能型接口 Consumer 消费型接口 Supplier 提供型接口 Predicate 断言型接口 常用 api stream, ...

  8. java8 Function函数式接口学习

    /*** 表示一个函数,它接收一个参数并且返回一个结果.* 这是一个函数式接口,它有一个重要的方法是apply(Object)* @param <T> 函数的输入类型* @param &l ...

  9. Java8 Stream 函数式接口

    在这里插入图片描述 先贴上几个案例,水平高超的同学可以挑战一下: 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里. 统计员工的最高薪资.平均薪资.薪资之和. 将员工按薪资从高到低 ...

最新文章

  1. Linux用户权限acl配置
  2. python 从字符串中提取数字 re.findall()
  3. 模拟实现priority_queue优先级队列
  4. 反函数连续性定理 反三角_高中数学:三角函数诱导公式及诱导公式口诀
  5. ht1621b和单片机电平匹配_有备无患,单片机面试问题集
  6. 单选按钮带文字_店铺装修V2.0全新升级!带你走进商城个性化装修的智能时代!...
  7. session是什么,存储在哪里
  8. Hadoop 入门笔记
  9. RS-485 接口 EMC 电路设计
  10. linux修改文件权限为所有人都可以访问,Linux 笔记分享八:文件权限的设定
  11. Java多线程篇--原子包、阻塞队列和并行流
  12. jquery的事件命名空间详解
  13. MPC5744-LINFlexD
  14. 关闭计算机睡眠模式,电脑睡眠模式怎么关闭
  15. 安卓机器人做图软件_机器人管理与开发软件RoboStudio出安卓版本啦~
  16. IDEA Diagrams使用实现类图(类关系图、子类、父类)
  17. Android电话拦截及拦截提示音的实现
  18. Createjs 学习笔记
  19. QDateTime 转QString格式
  20. 51单片机 Proteus仿真 电烙铁温度保护系统 DS18B20 温度报警系统

热门文章

  1. golang debug 配置_新鲜出炉的golang日志库
  2. 线性判别用于提取词向量_历年试题公开 | 2017级线性代数(I)期末试题
  3. igzo屏幕优点与缺点_手机贴膜怎么选?选对了可以省个屏幕钱
  4. 恶意文件 大数据案例库_无文件恶意软件感染完整指南
  5. 鸿蒙面向开发者语言,华为正式发布鸿蒙OS 面向全球开发者开源!
  6. 单片机tcp异常处理_TCP三次握手、四次挥手出现意外情况时,为保证稳定,是如何处理的...
  7. python 输出log_python:logging模块(记录打印日志)
  8. 存储器和 I/O 端口有哪两种编址方式?简要说明各自特点
  9. loop 逻辑门如何使用for_for..loop详解
  10. hive判断是否包含