Java从子类获取String

时间:2011-12-08 15:55:39

标签: java class

想象一下,我有这个:

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班得到n​​omeAnimal?

如果我把

System.out.println(" Nome: " + clientes.get(0).getAnimaisCliente(0).getNomeAnimal());

它不起作用。

从一个子类我们可以从超类获取东西,但另一种方式是arroud?有可能吗?

8 个答案:

答案 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)

除了上面提供的答案之外,您可能只想考虑课程的一般设计。如果nomeAnimalAnimal类应该真正意识到的东西,那么将其推高可能是有意义的(甚至变量的名称也表明它是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而失败。