1

我是编程新手,一周前刚刚学习了继承,并且有一个关于如何设计扩展其他类的适当类的问题。下面的代码是将所有银行账户对象存储到ArrayList中的 Bank,这就是我在 Bank 类中扩展类ArrayList的原因。

问题一:银行类属性为ArrayList。所以这就是我super()在构造函数内部调用的原因。由于Bank类扩展了ArrayList,因此可以通过调用创建属性super(),所以我认为bank中不需要其他私有属性,除了我通过调用创建的属性super()。这是进行继承的正确方法吗?

问题2:由于没有属性,所以卡在通过ObjectOutputStream进行序列化。我想写 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
    }
}
4

1 回答 1

1

关于问题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对象转换为正确的 type: (ArrayList) this,但这对于序列化不是必需的。我认为您遇到的问题是 Account 类不可序列化,请确保在类头中您说 Account 类实现了 Serializable。

于 2019-04-07T18:39:37.217 回答