我需要一些帮助。所以我有这个。我基本上想知道什么时候创建父类的对象数组,然后将该对象更改为子类,我可以访问该子类的方法,如果不是为什么。谢谢你的帮助。
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方法不起作用,所以我想知道为什么。如果有人能提供帮助,我们将非常感激。谢谢
答案 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());