2014-02-09 131 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];