mentre cercavo di capire il polimorfismo eeredità, ho fatto un piccolo programma per dimostrare questi argomenti. Il programma consiste in una superclasse "Albero" e tre sottoclassi "Betulla", "Acero" e "Quercia". Il costruttore di Tree fa in modo che tutti gli alberi inizino con un'altezza di 20 e 200 foglie. In Tree I ho un metodo astratto chiamato grow ().
Ecco il codice per Tree:
public abstract class Tree {
private int height;
private int numberOfLeaves;
public Tree()
{
height = 20;
numberOfLeaves = 200;
}
public Tree(int aheight, int anum)
{
height = aheight;
numberOfLeaves = anum;
}
public int getHeight()
{
return height;
}
public int getNumberOfLeaves()
{
return numberOfLeaves;
}
public void setNumberOfLeaves(int anum)
{
numberOfLeaves = anum;
}
public abstract String getType();
public void setHeight(int aheight)
{
height = aheight;
}
public abstract void grow();
}
Ecco il codice in Birch per grow ().
public void grow()
{
int height = super.getHeight();
super.setHeight(height++);
int num = super.getNumberOfLeaves();
super.setNumberOfLeaves(num+=30);
System.out.println("The Birch is Growing...");
}
Tuttavia, quando chiamo codice per far crescere una serie di alberi, nessuna delle loro altezze o numero di foglie cambia. Ecco il codice che ho usato per popolare la matrice di alberi (l'ho fatto manualmente):
ArrayList<Tree> treeArray = new ArrayList<Tree>();
treeArray.add( new Oak());
treeArray.add(new Birch());
treeArray.add(new Maple());
Ed ecco il codice che ho usato per chiamare crescere:
for (Tree tree : treeArray)
{
tree.grow();
System.out.println("The " + tree.getType() + ""s height is " + tree.getHeight() + " and it"s number of leaves is "+ tree.getNumberOfLeaves() +".");
}
Chiaramente, i valori nella superclasse non vengono modificati, ogni aiuto sarà apprezzato! Grazie!
risposte:
1 per risposta № 1Cambia il tuo codice in:
int height = super.getHeight();
super.setHeight(++height);
si noti che non è necessario chiamare super.method (). Finché il metodo è protetto (pubblico ancora meglio), è sufficiente semplificarlo per:
int height = getHeight();
setHeight(++height);
Chiami solo super. se si implementa nuovamente il metodo nella classe figlia e si desidera chiamare in modo specifico la classe genitore, che di solito può essere vista nel costruttore che chiama il costruttore genitore.
Un'altra cosa: la tua accessor deve essere cambiata un po 'solo per i casi di precauzione. vedi il codice qui sotto. Di solito il tuo IDE dovrebbe supportare la generazione automatica di accessor.
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
1 per risposta № 2
Questo codice:
int height = super.getHeight();
super.setHeight(height++);
non cambierà nulla, perché l'incremento di height
si verificherà dopo la chiamata a super.setHeight()
. Quindi stai solo impostando l'altezza sul valore corrente.