我是编程新手,我刚刚学习了一周前的继承,并且对于如何设计适当的类来扩展其他类有疑问。下面的代码是将所有银行帐户对象存储到ArrayList中的银行类,这就是我在Bank类中扩展类ArrayList的原因。
问题1:Bank类属性是ArrayList。所以这就是我在构造函数中调用super()
的原因。由于属性可以通过调用super()
来创建,因为Bank类扩展了ArrayList,我认为除了通过调用super()
创建的属性之外,bank中不需要其他私有属性。这是继承的正确方法吗?
问题2:由于没有属性,我通过ObjectOuputStream进行序列化。我想编写ArrayList(我在构造函数中通过执行super()
创建的属性),但不能,因为我不知道如何引用我在超级构造函数中创建的ArrayList属性。我试过writeObject(this),但它显然没有用。如何序列化ArrayList?
问题3:如果这是实现Bank类继承的正确方法,如何从ObjectInputStream加载ArrayList?因为没有属性,我不知道如何引用我在super()
中创建的属性,所以我做了类似的事情
this =(ArrayList)ois.readObject()
但它没有用......如果没有属性,如何使用反序列化加载ArrayList?
public class Bank extends ArrayList<Account> implements Serializable{
//no attribute
public Bank(){
super();
}
//other methods...
public void saveToBinary() throws IOException{
FileOutputStream fos = new FileOutputStream("Bank_Account_Inherit_Binary.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(this);//can't do this
oos.flush();
oos.close();
}
public void loadFromBinary() throws IOException, ClassNotFoundException{
FileInputStream fis = new FileInputStream("Bank_Account_Inherit_Binary.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Object object = ois.readObject();
this = (ArrayList<Account>)object;//not working b/c "this" is final variable
}
}
关于问题1,最好说Bank HAS-A ArrayList,而不是Bank IS-A ArrayList。如果扩展ArrayList,则允许外部类修改ArrayList的内容。通常,当您要扩展该对象提供的功能时,可以扩展对象。当您想要使用对象的方法和功能来完成您的类执行的任务时,将使用封装。您应该使用封装并维护包含帐户列表的私有实例变量:
public class Bank {
private ArrayList<Account> accounts;
public Bank() {
accounts = new ArrayList<Account>();
}
other methods...
}
如果要允许客户端访问和修改帐户列表,可以为其编写getter和setter。
如果您有一个帐户列表的私有实例,问题2的解决方案很简单,您现在可以将ArrayList传递给ObjectOutputStream。如果要引用ArrayList超类,可以将this
对象强制转换为正确的类型:(ArrayList) this
,但这不是序列化所必需的。我认为您遇到的问题是Account类不可序列化,请确保在类标题中您说类Account实现了Serializable。