2014-02-09 7 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, потому что вы не вызываете ваш пустой (не аргумент) конструктор:

player[i] = new Spartiates(); 

, который не инициализирует переменную energy (так он будет 0 по умолчанию). Вы только установить переменный до 100 в конструкторе, который принимает в String, а именно здесь:

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

Так или вызвать этот конструктор в цикл с некоторой строкой в ​​качестве аргумента, или обратитесь setEnergy() сеттерами с некоторым значением после создания объекта с помощью пустого конструктора.

Кроме того, это неправильно:

Racer [] player = new player[3]; 

Должно быть:

Racer [] player = new Racer[3]; 

или:

Racer [] player = new Spartiates[3]; 
Смежные вопросы