接口是否为Java中的对象提供了特定的含义

时间:2015-07-18 03:51:37

标签: java serialization interface

我对JAVA中的接口有疑问:

当一个类实现一个接口时,如果它没有实现它的方法,它会发生什么吗?仅仅实现界面,它是否为课程提供了任何意义上的改变?

例如,我有两个类,git checkout topic git reset master git checkout master git add . git commit -m 'Over 1,000 fakie rebase squash!' git branch -d topic getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN)

Test1

Test2实现public class Test1 implements Serializable { } public class Test2 { } 的事实外,类Test1Serializable是相同的。在这种情况下,Test1Test2的对象的功能/属性之间是否存在任何差异?是否可以将Test1类的对象分解为字节(仅仅因为类Test2实现了Serializable)?

如果是,那么这意味着实现一个接口为该类的对象提供了一些额外的含义吗?

4 个答案:

答案 0 :(得分:2)

直接来自Serializable -

的文件
  

类的可序列化由实现该类的类启用   java.io.Serializable接口。没有实现此功能的类   接口不会将其任何状态序列化或反序列化。   序列化接口没有方法或字段,仅提供服务   识别可序列化的语义。

Link

Q1> 在这种情况下,Test1和Test2 的对象的功能/属性之间是否存在差异?

Serializable是标记界面,这意味着没有方法或字段。

Q2> 是否可以将Test1类的对象分解为字节(只是因为类Test1实现了Serializable
是。

Q3> 如果是,那么这意味着实现一个接口为该类的对象提供了一些额外的含义

  

对象序列化生成包含Java信息的流   正在保存的对象的类。可序列化   对象,保持足够的信息来恢复这些对象   如果是一个不同的(但兼容的)版本的执行   上课。

该类可以选择定义以下方法:

  • 用于控制保存或保存信息的writeObject方法 将附加信息附加到流

  • 一个readObject方法,用于读取由...写的信息 相应的writeObject方法或更新对象的状态 恢复后

  • 允许类提名替换的writeReplace方法 要写入流的对象

Link

答案 1 :(得分:2)

这取决于您决定实施的界面的定义。 在示例中,您采用了其中一个实现了可序列化接口的类;它是一个标记接口,您不必重载任何方法。但是你知道这两个类之间存在差异,而Test1类的对象可以转换为外部存储的字节流,这样的功能不适用于Test2对象。此外,还有一个serialId类成员,Test1有,但Test2没有。

这是一个具体案例;但是让我们说你实现的接口有抽象方法,那么在这种情况下,Test1类要么也必须是一个抽象类,要么必须为接口的那些抽象方法提供具体的定义。在这种情况下,Test1和Test2类彼此之间会有很大的不同。仅供参考,界面主体可以包含抽象方法,默认方法和静态方法。

答案 2 :(得分:1)

在Java 8+中,接口可以提供默认方法。对于example 13.5.6-1. Adding A Default Method(这意味着接口可以添加方法实现),

interface Painter {
    default void draw() {
        System.out.println("Here's a picture...");
    }
}

但是,Serializablemarker interface(维基百科部分说)仅仅存在此类接口就表明了实现类方面的特定行为。您可能希望将其与Externalizable进行比较。

答案 3 :(得分:1)

一个接口,最基本的形式,是一组定义一些核心功能的空方法。实现接口的类将需要包含其所有方法。

但是,接口Serializable没有任何方法。它只是声明"这个对象可以被序列化,"他们有时会依赖其他特殊方法(readObject()writeObject()等)进行处理。

以下是Javadocs的引用:

  

类的可序列化由实现该类的类启用   java.io.Serializable接口。没有实现此功能的类   接口不会将其任何状态序列化或反序列化。   序列化接口没有方法或字段,仅提供服务   识别可序列化的语义。

因此,只有在实现接口Serializable时才能序列化类。