知道继承的类型

时间:2015-04-11 20:51:58

标签: java inheritance

如果我有像

这样的继承类
class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}

我怎么知道哪种类型的课程? (我的意思是,如果想要知道下面的一个物体是狗还是猫)

我有一个ArrayList Animals,其中包含CatDog s。我将此信息保存在一个文件中,以便以后加载信息。但问题是当我想加载我需要知道哪种类型的信息时,为了调用dog或cat构造函数(cat和dog有不同的构造函数参数)。

所以我的一个解决方案是存储对象的类型,以便在我加载信息时调用正确的构造函数。对此有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

我认为你想重新实现java的序列化。 而不是那个

  1. 您应该使类Animal实现Serializable标记接口
  2. 简单地写入并从文件中读取您的数组like described here

答案 1 :(得分:1)

由于您要保存信息,因此您还可以打印出类型。

例如,您可以使用以下内容:

for (final Animals animal : myAnimalList){
    output.print(animal.getClass().getSimpleName());
    output.println(animal.getData());
}

对于Dog的实例,这将打印出"Dog",对于Cat的实例,它将打印出"Cat"。随后是getData()信息。这假设getData()将包含用于打印信息的适当数据。

然后你可以实现类似的目标:

Dog[name=Ruff, age=17, favoriteToy=Ball]
Cat[name=Tom, age=102, hates=Everyone]

然后,您可以根据所需字段轻松填写重建狗和猫所需的信息。

话虽这么说,你可以把它写到文件中。正如您的问题所示,这与您已经这样做的方式类似。

之前已经完成了这项工作,所以创建自己的方法,不建议这样做。


另一种方法是为每个类设置一个唯一的标识符(想想serialVersionUID)。

这只是Serialization的一种形式。然后,基本的readwrite方法可以处理在类到类的基础上解析正确的数据。

Serializable课程实施Animals会更好,然后发送您不想写入并阅读transient的字段。

然后,您可以使用这些签名填写所有适当的方法:

private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;

答案 2 :(得分:-1)

使用getClass()例如:

Animal dog = new Dog();
if (dog.getClass().equals(Dog.class)) {
    System.out.printf("Its dog!");
}

或者正如Beko指出的那样

Animal dog = new Dog();
if (dog instanceof Dog) {
    System.out.printf("Its dog!");
}