将父对象更改为子对象

时间:2014-02-09 23:48:37

标签: java parent-child

我需要一些帮助。所以我有这个。我基本上想知道什么时候创建父类的对象数组,然后将该对象更改为子类,我可以访问该子类的方法,如果不是为什么。谢谢你的帮助。

public class Racer {

private String name;
private int position;

// Constructor
public Racer()
{}
public Racer(String name)
{
    this.name = name;
    position = 0;
}

public String getName()
{
    return name;
}


public int getPosition()
{
    return position;
}

public void setPosition(int n)
{
    position = n;
}
public void setName(String n){
    this.name=n;
}
}

儿童班

public class Spartiates extends Racer{

private int energy;

public Spartiates(){
    super();
}

public Spartiates(String name){
    setName(name);
    setPosition(20);
    energy=100;
}

public void setEnergy(int energy){
    this.energy=energy;
}

public int getEnergy(){
    return energy;
}
}

主要班级

 public class demo{
     public static void main(String[] args){
        Racer [] player = new player[3];
        for(int i=0; i<player.length; i++){
            player[i] = new Spartiates();
        }
        System.out.println(player[1].getEnergy());
  }

所以这里的问题是getEnergy方法不起作用,所以我想知道为什么。如果有人能提供帮助,我们将非常感激。谢谢

4 个答案:

答案 0 :(得分:0)

您需要在超类中定义函数或将对象强制转换为子类。

答案 1 :(得分:0)

如果您希望数组仅包含子类Spartiates的元素,则将其声明为此类。

否则,如果它需要保存两种类型的对象,那么只有这样才能检查instanceof

if (player[1] instanceof Spartiates)
    System.out.println(((Spartiates)player[1]).getEnergy());
else
    // handle other types

答案 2 :(得分:0)

energy为0的原因是因为你正在调用你的空(无arg)构造函数:

player[i] = new Spartiates();

没有初始化energy变量(因此默认情况下它将为0)。您只在构造函数中将变量设置为100,其中包含String,即此处:

public Spartiates(String name){
    setName(name);
    setPosition(20);
    energy=100;
}

因此要么在for循环中使用某个字符串作为参数调用该构造函数,要么在使用空构造函数创建对象后调用具有某个值的setEnergy() setter。

另外,这是错误的:

Racer [] player = new player[3];

应该是:

Racer [] player = new Racer[3];

或:

Racer [] player = new Spartiates[3];

答案 3 :(得分:0)

这将在这里讨论:

Is it possible to call subclasses' methods on a superclass object?

为什么做这样的事情的所有原因可能永远不是一个好主意:)。

您必须将其强制转换为子类的实例。如果您打算使用混合的对象实例数组,则需要首先检查类型:

System.out.println(((Racer)player[1]).getEnergy());