Java 是可序列化的还是可继承的

Java 是可序列化的还是可继承的,java,serialization,Java,Serialization,是可序列化的、可继承的。特别是如果我有 class A implements Serializable{} class B extends A{} B类是否可序列化?是。这源于Java中的继承概念。因为A是可序列化的,B扩展了A,所以B是可序列化的 请注意,A和B的所有非静态非瞬态字段也必须包含可序列化对象,否则当您尝试序列化它们时,在运行时将出现NotSerializableException。是,如果实现了超类,则子类也是可序列化的。是的,可序列化类的子类也是可序列化的 更多信息 如果

是可序列化的、可继承的。特别是如果我有

class A implements Serializable{}

class B extends A{}

B类是否可序列化?

是。这源于Java中的继承概念。因为A是可序列化的,B扩展了A,所以B是可序列化的


请注意,A和B的所有非静态非瞬态字段也必须包含可序列化对象,否则当您尝试序列化它们时,在运行时将出现NotSerializableException。

是,如果实现了超类,则子类也是可序列化的。

是的,可序列化类的子类也是可序列化的

更多信息


如果一个类是可序列化的,那么所有子类都是可序列化的。但是,如果您想阻止其超类可序列化的子类成为可序列化的子类,也可以这样做

如果你想预防,那么使用

NotSerializableException——当实例需要具有可序列化接口时抛出。序列化运行时或实例的类可以引发此异常。参数应该是类的名称

参考官方文件——

通过以这种方式使用它,您可以完成此任务

private void writeObject(ObjectOutputStream out) throws IOException {

    throw new NotSerializableException(“Not today!”);
}


private void readObject(ObjectInputStream in ) throws IOException {

    throw new NotSerializableException(“Not today!”);

}
子类是序列化的,而父类不是

如果一个子类是可序列化的,那绝对不意味着它的超类也是可序列化的。当子类被反序列化时,超类的无参数构造函数将运行

接口在Java编程中还有一个非常重要的角色 语言。接口不是类层次结构的一部分,但 他们和班级一起工作。Java编程语言 不允许多重继承(继承将在后面讨论 但接口提供了一种替代方法

在Java中,一个类只能从一个类继承,但它可以实现 不止一个接口。因此,对象可以有多种类型: 它们自己的类的类型以及所创建的所有接口的类型 他们实施。这意味着如果一个变量被声明为 接口的类型,其值可以引用 从实现接口的任何类实例化。这是 在本课程后面的“使用 接口作为一种类型。”

我想你的意思是,如果你有一个函数
foo
,它得到
(可序列化的ptr)
,你能用
类B的实例调用它吗


此外,您还可以重写A(祖先)实现。

对给定代码进行了以下检查

boolean b = new B() instanceof Serializable;
System.out.println(b);

它返回
true

基类实现的所有接口都由其派生类继承。不仅仅是可序列化。

我同意可序列化性是继承的,但也存在一些问题(尽管很少),即偶尔使用的工具无法识别这一事实。因此,即使它不是必需的,我也会付出额外的努力来声明子类是实现可序列化的。

B
不是可序列化的,它继承自超级类,实现了
可序列化的
接口,在Java中语义很重要。Java中明确提到了这一点,“类的可序列化性由实现
java.io.Serializable
接口的类启用。未实现此接口的类的任何状态都不会序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。“@0x90:扩展一个类或实现一个接口精确地定义了一个is a关系。是的,B是可序列化的。回答这个问题不需要执行代码。它涉及Java语言规范的一个属性。@EJP ohk!!但我想用另一种不同的方式来回答。如果没有意义,我将删除。唯一需要的参考是。与
Serializable
完全无关。