【问题标题】:Accessing and modifying properties of a super class from sub class?从子类访问和修改超类的属性?
【发布时间】:2013-12-12 15:08:24
【问题描述】:

在尝试掌握多态性和继承时,我编写了一个小程序来演示这些主题。该程序由一个超类“Tree”和三个子类“Birch”、“Maple”和“Oak”组成。 Tree 的构造函数使得所有的树都以 20 和 200 片叶子的高度开始。在 Tree 中,我有一个名为 grow() 的抽象方法。

这是树的代码:

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 中用于 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() +".");
    }

显然,超类中的值没有被修改。任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 你能把Tree的代码贴出来吗?
  • 虽然还是要看树类是怎么写的,试试 super.setHeight(++height);
  • 好的@ElliottFrisch,我发布了树的代码
  • 您的树代码似乎没问题。向我们展示如何填充 treeArray。
  • @Rudy 事实上,我手动填充了 treeArray。我只是做了 treeArray.add(new Birch())

标签: java inheritance polymorphism subclass superclass


【解决方案1】:

这段代码:

int height = super.getHeight();
super.setHeight(height++);

不会改变任何东西,因为height 的增量将发生在调用super.setHeight() 之后。所以你只是将高度设置为其当前值。

【讨论】:

    【解决方案2】:

    将您的代码更改为:

    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;
    
        }
    

    【讨论】:

    • 即使将高度上的运算符更改为预增量,它仍然没有更改值;主要功能仍然保持高度为 20
    • 我只是把树的代码。除了构造函数的名称以及它在 grow() 中增加了多少叶子之外,Oak 几乎与 Birch 和 maple 完全一样。
    • 你的 Tree 类中没有奇怪的东西。展示如何填充 treeArray
    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 2017-04-18
    • 2019-04-02
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多