面试题答案
一键面试区别
- 抽象类:
- 抽象类实现
Serializable
接口后,其子类如果没有显式声明实现Serializable
接口,默认是可序列化的,因为继承了抽象类的序列化特性。 - 抽象类可以有具体的成员变量和方法,包括非静态和非瞬态的成员变量,这些变量在序列化时会被默认序列化(除非标记为
transient
)。
- 抽象类实现
- 接口:
- 接口本身不能实现
Serializable
接口,因为接口只能定义方法签名,不能有实现。 - 实现接口的类如果要进行序列化,必须显式实现
Serializable
接口。实现接口的类的成员变量和方法遵循Serializable
接口的规则,非静态非瞬态成员变量默认会被序列化(除非标记为transient
)。
- 接口本身不能实现
代码示例
- 抽象类的序列化示例:
import java.io.*;
// 抽象类实现Serializable接口
abstract class AbstractSerializableClass implements Serializable {
private String abstractData;
public AbstractSerializableClass(String abstractData) {
this.abstractData = abstractData;
}
public String getAbstractData() {
return abstractData;
}
}
class ConcreteSubclass extends AbstractSerializableClass {
private String concreteData;
public ConcreteSubclass(String abstractData, String concreteData) {
super(abstractData);
this.concreteData = concreteData;
}
public String getConcreteData() {
return concreteData;
}
}
在上述代码中,AbstractSerializableClass
抽象类实现了Serializable
接口,ConcreteSubclass
继承自AbstractSerializableClass
,即使ConcreteSubclass
没有显式实现Serializable
接口,它也是可序列化的。
- 接口实现类的序列化示例:
import java.io.*;
// 定义接口
interface MyInterface {
void doSomething();
}
// 实现接口并实现Serializable接口
class SerializableInterfaceImplementation implements MyInterface, Serializable {
private String data;
public SerializableInterfaceImplementation(String data) {
this.data = data;
}
@Override
public void doSomething() {
System.out.println("Doing something with data: " + data);
}
}
在这个例子中,SerializableInterfaceImplementation
类实现了MyInterface
接口,并且必须显式实现Serializable
接口才能进行序列化操作。