想象一下,我有这个:
public class Animal {
private String racaAnimal;
private String corAnimal;
public String getCorAnimal() {
return this.corAnimal;
}
public String getRacaAnimal() {
return this.racaAnimal;
}
public Animal getAnimaisCliente(int indice) {
return this.animaisCliente[indice];
}
}
public class Estimacao extends Animal{
private String nomeAnimal;
public String getNomeAnimal() {
return nomeAnimal;
}
}
public class Cliente{
private Animal[] animaisCliente;
}
构造函数没有显示,但它们工作正常。
我有一个支持所有Cliente的arraylist
ArrayList<Cliente> clientes = new ArrayList<Cliente>();
动物就像这样创造
Estimacao animaisEstimacao = new Estimacao(nomeAnimal,racaAnimal,corAnimal);
然后将其添加到Cliente中的Animal数组
现在,如果我这样做:
System.out.println(" Raça: " + clientes.get(0).getAnimaisCliente(0).getRacaAnimal());
有效。 但是我怎么能从Estimacao班得到nomeAnimal?
如果我把
System.out.println(" Nome: " + clientes.get(0).getAnimaisCliente(0).getNomeAnimal());
它不起作用。
从一个子类我们可以从超类获取东西,但另一种方式是arroud?有可能吗?
答案 0 :(得分:5)
您需要将Animal
强制转换为Estimacao
。但很明显,如果您不想冒异常风险,请确保您的Animal
之前是正确的类:
Animal animal = clientes.get(0).getAnimaisCliente(0);
if (animal instanceof Estimacao) {
System.out.println(" Nome: " + ((Estimacao) animal).getNomeAnimal());
}
答案 1 :(得分:3)
以这种方式思考:子类的实例也是超类的实例。但是超类的实例不一定是子类的实例。因此,超类方法始终可用,但子类方法仅在子类中可用。
如果您确定您拥有子类的实例,则可以显式地转换它并在其上调用特定于子类的方法,但是您需要注意这样做。
答案 2 :(得分:2)
尝试
System.out.println(" Nome: " + ((Estimacao) clientes.get(0).getAnimaisCliente(0)).getNomeAnimal());
答案 3 :(得分:1)
除了上面提供的答案之外,您可能只想考虑课程的一般设计。如果nomeAnimal
是Animal
类应该真正意识到的东西,那么将其推高可能是有意义的(甚至变量的名称也表明它是Animal
- ness)。< / p>
如果没有,那么您可能希望进一步考虑通过向Animal
类添加displaySpecificInfo()并使其成为abstract
或在{{1}中添加空实现来利用多态性}类。这将允许您从当前 - 失败 - 打印调用的位置调用它,然后在派生类的实现中具有当前行。这样可以节省对转换的需求(不是铸造有任何问题),以及创建更符合OO / Encapsulation的实现。
编辑:
@Guillaume的优秀笔记和我的道歉可能会剥夺更多层OO洋葱然后你感兴趣! :)
答案 4 :(得分:0)
将Animal
投射到Estimacao
以访问Estimacao
答案 5 :(得分:0)
根据您的要求,这是不可能的。但是,您可以在基类(getNomeAnimal()
)中添加Animal
,这将返回null
或空字符串 - 然后Estimacao
类的实例将返回正确的价值观。
答案 6 :(得分:0)
这是动物类中的错位用法:
this.animaisCliente[indice] // animaisCliente is not an attribute of Animal
答案 7 :(得分:0)
除非您将Animal类型对象强制转换为Estimacao类型,否则不能这样做。只有在强制转换后,getNomeAnimal()才可用。但这是一件坏事。如果您的数组包含Animal类型和Estimacao类型对象的混合,则它将因ClassCastException而失败。