我正在阅读关于DD的 Wikipedia 文章,然后跳到最后给出的“Java 中的双重调度和示例”链接。以下 Serializable 示例的描述对我来说似乎相当混乱:
A a = new A();
ObjectOutputStream oos = new ObjectOutputStream();
oos.writeObject( a);
这是描述:
为了序列化A,
ObjectOutputStream
首先查看该方法是否writeObject( ObjectOutputStream oos)
存在。如果是这样,那么它以自身作为参数调用该方法。然后该writeObject
方法将调用分派回ObjectOutputStream
(从而使其成为双重分派)。在进行这个非常简单的回调时,ObjectOutputStream
他说:“我将把你的状态写入这个流的责任委托给你”。在做出这个简单的选择时,ObjectOutputStream
它已经从我们的对象中解耦了A
。对象A
反过来说好的,这是我想写在流上的一些状态。如果该值是一个原始值,那么它可以通过 write 方法的重载来处理。如果没有,则可以在对象图中的下一个级别继续来回,直到所有有用的状态都已放置在流上。
我猜测描述可能会令人困惑,因为所描述的是幕后发生的事情,而不是呈现的代码,否则它似乎没有多大意义。以下是让我感到困惑的部分:
- “
ObjectOutputStream
首先查看该方法是否writeObject( ObjectOutputStream oos)
存在”。为什么ObjectOutputStream
需要检查这个方法是否存在,因为它是它自己的方法? - “如果是这样,那么它会以自身作为参数调用该方法”。在我看来,它
writeObject
使用实例A
作为参数调用。回到上一项,如果它是用 的实例调用的,为什么还要寻找writeObject
带有 arg 的签名?ObjectOutputStream
A
- “
writeObject
然后该方法将调用分派回ObjectOutputStream
(从而使其成为双重分派)”。同样,该writeObject
方法属于ObjectOutputStream
该类,因此我看不到它是如何“派回的ObjectOutputStream
”,因为那似乎是原始目的地。
我只是在这里遗漏了一些基本的东西,还是这是一个写得不好/描述得不好的例子?如果这是一个不好的例子,我想更改 Wikipedia 文章以指向更好的文章,因此请随时提供建议。
谢谢。