在尝试掌握多态性和继承时,我制作了一个小程序来演示这些主题。该程序由一个超类'Tree'和三个子类'Birch','Maple'和'Oak'组成。 Tree的构造函数使得所有树木都以20和200叶子的高度开始。在Tree中,我有一个名为grow()的抽象方法。
以下是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();
}
这是Birch for 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...");
}
然而,当我调用代码使树木数组生长时,它们的高度或叶子数量都没有变化。 这是我用来填充树形数组的代码(我手动完成):
ArrayList<Tree> treeArray = new ArrayList<Tree>();
treeArray.add( new Oak());
treeArray.add(new Birch());
treeArray.add(new Maple());
以下是我以前称之为增长的代码:
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() +".");
}
显然,超类中的值未被修改。任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
此代码:
int height = super.getHeight();
super.setHeight(height++);
不会改变任何内容,因为在调用height
之后,{em}会增加super.setHeight()
。所以你只需将高度设置为当前值。
答案 1 :(得分:1)
将您的代码更改为:
int height = super.getHeight();
super.setHeight(++height);
请注意,您无需调用super.method()。只要方法受到保护(公共甚至更好),您可以将其简化为:
int height = getHeight();
setHeight(++height);
你只能打电话给超级。如果你在子类中再次实现该方法并且想要专门调用父类,通常可以在构造函数中调用父构造函数。
还有一件事:您的访问者需要稍微改变一下,只是为了预先警告。见下面的代码。通常,您的IDE应支持自动生成访问器。
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}