关于Java序列化的澄清

关于Java序列化的澄清,java,Java,我正在学习序列化,在外部化中遇到了这个函数 我知道该方法创建了一个名为oi的ObjectOutput类型的对象,用于将实例变量写入该对象。当我想进一步了解ObjectOutput类时,我很惊讶ObjectOutput是一个接口!我认为Java不允许创建接口类型的对象。请让我知道为什么会这样,或者如果我理解错了,请纠正我。首先,正如trappski在评论中指出的那样,writeExternal没有创造任何东西ObjectOutput是由调用的任何代码传递给它的参数writeExternal 接口的

我正在学习序列化,在外部化中遇到了这个函数


我知道该方法创建了一个名为oi的ObjectOutput类型的对象,用于将实例变量写入该对象。当我想进一步了解ObjectOutput类时,我很惊讶ObjectOutput是一个接口!我认为Java不允许创建接口类型的对象。请让我知道为什么会这样,或者如果我理解错了,请纠正我。

首先,正如
trappski
在评论中指出的那样,
writeExternal
没有创造任何东西
ObjectOutput
是由调用的任何代码传递给它的参数
writeExternal

接口的诀窍在于它们是一个“合同”。不能从接口创建对象,但可以创建实现接口的类,然后从这些类创建对象。然后,您可以在任何需要接口的地方使用实现接口的类的对象

在这种情况下,如果您有一个类
BigObjectOutput
,它实现了
ObjectOutput
,如下所示:

class BigObjectOutput implements ObjectOutput {
  // code...
}
然后可以创建类型为
BigObjectOutput
的对象,如下所示:

BigObjectOutput bigObject = new BigObjectOutput;
并将其传递到方法中,因为
BigObjectOutput
实现了
ObjectOutput

writeExternal(bigObject);
class LittleObjectOutput implements ObjectOutput {
  // code...
}

LittleObjectOutput littleObject = new LittleObjectOutput();

writeOutput(littleObject);
你为什么要这么做?这样,您就可以传入其类型实现
ObjectOutput
的任何对象:

writeExternal(bigObject);
class LittleObjectOutput implements ObjectOutput {
  // code...
}

LittleObjectOutput littleObject = new LittleObjectOutput();

writeOutput(littleObject);

因此,如果您的
writeOutput
接受任何类型实现
OutputObject
接口的对象,比只接受
BigObjectOutput
s的对象更有用。

谢谢您的解释@Emma。您的意思是说LittleObjectOutput类扩展了BigObjectOutput实现了ObjectOutput吗{ //代码。。。 }

LittleObjectOutput littleObject=新的LittleObjectOutput()

writeExternal(littleObject)

  • 这意味着如果父级和子级都可以使用该函数,则该函数将非常有用

此处未创建ObjectOutput。它是方法的参数,因此由调用方提供。只要提供的对象实现了接口,对象就可以是ObjectOutput类型。感谢您的解释@Emma Burrows,但在您的示例中,您是否试图说
code
No,我的示例是
BigObjectOutput
LittleObjectOutput
都实现了接口。他们不需要互相延伸。这里的关键是,它们都实现了接口,因此都可以在期望该接口的方法中使用。