zatiaľ čo sa snaží získať pochopenie polymorfizmu adedičstvo, urobil som malý program na demonštráciu týchto tém. Program pozostáva z superclass "Tree" a troch podtried "Birch", "Maple" a "Oak". Konštruktér stromu robí tak, že všetky stromy začínajú s výškou 20 a 200 listov. V strome Mám abstraktnú metódu nazvanú rast ().
Tu je kód pre 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();
}
Tu je kód v Birchu pre rast ().
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...");
}
Keď však zavolám kód, aby rástol rast stromov, nezmení sa ich výška ani počet listov. Tu je kód, ktorý som použil na zaplnenie poľa stromov (urobil som to ručne):
ArrayList<Tree> treeArray = new ArrayList<Tree>();
treeArray.add( new Oak());
treeArray.add(new Birch());
treeArray.add(new Maple());
A tu je kód, ktorý som nazýval rast:
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() +".");
}
Je zrejmé, že hodnoty v nadtriede nie sú modifikované, akákoľvek pomoc bude ocenená!
odpovede:
1 pre odpoveď č. 1Zmeňte svoj kód na:
int height = super.getHeight();
super.setHeight(++height);
Všimnite si, že nepotrebujete zavolať super.method (), ak je metóda chránená (verejné ešte lepšie), môžete ju jednoducho zjednodušiť na:
int height = getHeight();
setHeight(++height);
Voláte len super. ak implementujete metódu znova v triede vášho dieťaťa a chcete konkrétne zavolať na materskú triedu, ktorá sa zvyčajne dá vidieť v konštruktore, ktorý volá konštruktéra.
Ešte jedna vec: váš prídavný príslušník musí byť trochu zmenený len pre prípad predbežnej opatrnosti. viď kód nižšie. Zvyčajne vaša IDE by mala podporovať automatické generovanie príslušenstva.
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
1 pre odpoveď č. 2
Tento kód:
int height = super.getHeight();
super.setHeight(height++);
nebudú nič meniť, pretože prírastok height
objaví sa po volanie na super.setHeight()
, Takže len nastavujete výšku na svoju aktuálnu hodnotu.