@@ -226,11 +226,11 @@ public class DrainToExample {
226226
227227! [ArrayBlockingQueue  类图](https: // oss.javaguide.cn/github/javaguide/java/collection/arrayblockingqueue-class-diagram.png)
228228
229- 从图中我们可以看出,`ArrayBlockingQueue ` 继承了阻塞队列  `BlockingQueue ` 这个接口,不难猜出通过继承  `BlockingQueue ` 这个接口之后,`ArrayBlockingQueue ` 就拥有了阻塞队列那些常见的操作行为。
229+ 从图中我们可以看出,`ArrayBlockingQueue ` 实现了阻塞队列  `BlockingQueue ` 这个接口,不难猜出通过实现  `BlockingQueue ` 这个接口之后,`ArrayBlockingQueue ` 就拥有了阻塞队列那些常见的操作行为。
230230
231231同时, `ArrayBlockingQueue ` 还继承了 `AbstractQueue ` 这个抽象类,这个继承了 `AbstractCollection ` 和 `Queue ` 的抽象类,从抽象类的特定和语义我们也可以猜出,这个继承关系使得 `ArrayBlockingQueue ` 拥有了队列的常见操作。
232232
233- 所以我们是否可以得出这样一个结论,通过继承 `AbstractQueue ` 获得队列所有的操作模板,其实现的入队和出队操作的整体框架。然后 `ArrayBlockingQueue ` 通过继承  `BlockingQueue ` 获取到阻塞队列的常见操作并将这些操作实现,填充到 `AbstractQueue ` 模板方法的细节中,由此 `ArrayBlockingQueue ` 成为一个完整的阻塞队列。
233+ 所以我们是否可以得出这样一个结论,通过继承 `AbstractQueue ` 获得队列所有的操作模板,其实现的入队和出队操作的整体框架。然后 `ArrayBlockingQueue ` 通过实现  `BlockingQueue ` 获取到阻塞队列的常见操作并将这些操作实现,填充到 `AbstractQueue ` 模板方法的细节中,由此 `ArrayBlockingQueue ` 成为一个完整的阻塞队列。
234234
235235为了印证这一点,我们到源码中一探究竟。首先我们先来看看 `AbstractQueue `,从类的继承关系我们可以大致得出,它通过 `AbstractCollection ` 获得了集合的常见操作方法,然后通过 `Queue ` 接口获得了队列的特性。
236236
@@ -244,7 +244,7 @@ public abstract class AbstractQueue<E>
244244
245245对于集合的操作无非是增删改查,所以我们不妨从添加方法入手,从源码中我们可以看到,它实现了 `AbstractCollection ` 的 `add` 方法,其内部逻辑如下: 
246246
247- 1.  调用继承 `Queue ` 接口的来的  `offer` 方法,如果 `offer` 成功则返回 `true `。
247+ 1.  调用继承 `Queue ` 接口得来的  `offer` 方法,如果 `offer` 成功则返回 `true `。
2482482.  如果 `offer` 失败,即代表当前元素入队失败直接抛异常。
249249
250250```java
@@ -258,7 +258,7 @@ public boolean add(E e) {
258258
259259而 `AbstractQueue ` 中并没有对 `Queue ` 的 `offer` 的实现,很明显这样做的目的是定义好了 `add` 的核心逻辑,将 `offer` 的细节交由其子类即我们的 `ArrayBlockingQueue ` 实现。
260260
261- 到此,我们对于抽象类 `AbstractQueue ` 的分析就结束了,我们继续看看 `ArrayBlockingQueue ` 中另一个重要的继承接口  `BlockingQueue `。
261+ 到此,我们对于抽象类 `AbstractQueue ` 的分析就结束了,我们继续看看 `ArrayBlockingQueue ` 中实现的另一个重要接口  `BlockingQueue `。
262262
263263点开 `BlockingQueue ` 之后,我们可以看到这个接口同样继承了 `Queue ` 接口,这就意味着它也具备了队列所拥有的所有行为。同时,它还定义了自己所需要实现的方法。
264264
@@ -302,11 +302,11 @@ public interface BlockingQueue<E> extends Queue<E> {
302302}
303303```
304304
305- 了解了 `BlockingQueue ` 的常见操作后,我们就知道了 `ArrayBlockingQueue ` 通过继承  `BlockingQueue ` 的方法并实现后 ,填充到 `AbstractQueue ` 的方法上,由此我们便知道了上文中 `AbstractQueue ` 的 `add` 方法的 `offer` 方法是哪里是实现的了。
305+ 了解了 `BlockingQueue ` 的常见操作后,我们就知道了 `ArrayBlockingQueue ` 通过实现  `BlockingQueue ` 的方法并重写后 ,填充到 `AbstractQueue ` 的方法上,由此我们便知道了上文中 `AbstractQueue ` 的 `add` 方法的 `offer` 方法是哪里是实现的了。
306306
307307```java
308308public  boolean  add(E  e) {
309-   // AbstractQueue的offer来自下层的ArrayBlockingQueue从BlockingQueue继承并实现的offer方法 
309+   // AbstractQueue的offer来自下层的ArrayBlockingQueue从BlockingQueue实现并重写的offer方法 
310310  if  (offer(e))
311311      return  true ;
312312  else 
0 commit comments