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