我对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 {
}
的事实外,类Test1
和Serializable
是相同的。在这种情况下,Test1
和Test2
的对象的功能/属性之间是否存在任何差异?是否可以将Test1
类的对象分解为字节(仅仅因为类Test2
实现了Serializable)?
如果是,那么这意味着实现一个接口为该类的对象提供了一些额外的含义吗?
答案 0 :(得分:2)
直接来自Serializable
-
类的可序列化由实现该类的类启用 java.io.Serializable接口。没有实现此功能的类 接口不会将其任何状态序列化或反序列化。 序列化接口没有方法或字段,仅提供服务 识别可序列化的语义。
Q1> 在这种情况下,Test1和Test2 的对象的功能/属性之间是否存在差异?
Serializable
是标记界面,这意味着没有方法或字段。
Q2> 是否可以将Test1类的对象分解为字节(只是因为类Test1实现了Serializable ?
是。
Q3> 如果是,那么这意味着实现一个接口为该类的对象提供了一些额外的含义?
对象序列化生成包含Java信息的流 正在保存的对象的类。可序列化 对象,保持足够的信息来恢复这些对象 如果是一个不同的(但兼容的)版本的执行 上课。
该类可以选择定义以下方法:
用于控制保存或保存信息的writeObject方法 将附加信息附加到流
一个readObject方法,用于读取由...写的信息 相应的writeObject方法或更新对象的状态 恢复后
允许类提名替换的writeReplace方法 要写入流的对象
答案 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..."); } }
但是,Serializable
是marker interface(维基百科部分说)仅仅存在此类接口就表明了实现类方面的特定行为。您可能希望将其与Externalizable
进行比较。
答案 3 :(得分:1)
一个接口,最基本的形式,是一组定义一些核心功能的空方法。实现接口的类将需要包含其所有方法。
但是,接口Serializable
没有任何方法。它只是声明"这个对象可以被序列化,"他们有时会依赖其他特殊方法(readObject()
,writeObject()
等)进行处理。
以下是Javadocs的引用:
类的可序列化由实现该类的类启用 java.io.Serializable接口。没有实现此功能的类 接口不会将其任何状态序列化或反序列化。 序列化接口没有方法或字段,仅提供服务 识别可序列化的语义。
因此,只有在实现接口Serializable
时才能序列化类。