2014-02-09 217 views
-1

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

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

这是这里讨论:

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

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

您必须将其转换为子类的实例。如果您计划使用混合的对象实例,您需要首先检查类型:

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

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

0

如果您打算将数组仅保存子类Spartiates的元素,则声明为如此。

否则,如果需要保存这两种类型的对象,则唯一的方法是使用instanceof进行检查。

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

之所以能为0,是因为你在呼唤你的空(无ARG)构造函数:

player[i] = new Spartiates(); 

不初始化变量energy(所以它会默认为0)。你只在需要的String,即这里的构造函数的变量设置为100:

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

因此,要么调用构造函数在for循环中一些字符串作为参数,或与一些价值打电话给你setEnergy()二传手在用空的构造函数创建对象之后。

而且,这是错误的:

Racer [] player = new player[3]; 

它应该阅读:

Racer [] player = new Racer[3]; 

或:

Racer [] player = new Spartiates[3];