4

我正在尝试使用继承,以便我可以正确执行测试类中包含的代码。我不确定如何实现具有 goPee() 方法的名为浴室的抽象类或接口。你知道如何编码吗?

如果我添加一个抽象类或一个接口并分别通过扩展或实现将它们添加到 Human 类中,我总是被要求在 Human 类中为 goPee() 方法编写实现,我不想这样做,因为我的 goPee() 方法实现是在 Male 和 Female 子类中编写的。

import java.util.ArrayList;

class Human
{
  private String name;
  public Human (String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
  }
  public void eat()
  {
    System.out.println(name + " went to fridge.");
  }
}

class Male extends Human
{
  public Male(String name)
  {
    super(name);
  }
  public void goPee()
  {
    System.out.println(getName() + " stood up.");
  }
}

class Female extends Human
{
  public Female(String name)
  {
    super(name);
  }
  public void goPee()
  {
    System.out.println(getName() + " sat down.");
  }
}

public class TestHuman
{
  public static void main(String[] args)
  {
    ArrayList<Human> arr = new ArrayList<Human>();
    arr.add(new Male("john"));
    arr.add(new Female("sally"));
    for (int count = 0; count < arr.size(); count++)
    {
      arr.get(count).eat();
      arr.get(count).goPee();
    }
  }
}
4

3 回答 3

7

goPee()您必须在 Human 类中定义一个方法。由于您在两个子类中都覆盖了它,因此它可以是一个抽象方法。这也意味着 Human 必须是抽象的。

abstract class Human
{
  private String name;
  public Human (String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
      }
  public void eat()
  {
    System.out.println(name + " went to fridge.");
  }
  public abstract void goPee();
}

在 Human 中声明一个抽象方法可确保 Human 的所有子类goPee()以相同的参数和返回类型实现该方法。这使您可以goPee()在不知道是男性还是女性的情况下调用人类,因为您知道两者都实现了它。

于 2012-04-26T01:36:14.493 回答
5

为了能够多态地调用子类的方法,您需要在基类中定义一个具有相同签名的方法。

abstract class Human {
    public abstract void goPee();
}

您不需要将类抽象化,但在这种情况下这样做是有意义的,因为没有无性别的人类。但是,如果您想在派生类的方法之间共享一些实现,您可以将通用代码放在基类实现中:

class Human {
    public void goPee() {
        System.out.println(getName() + " lifted the cover.");
    }
}

class Male extends Human {
    public void goPee() {
        super.goPee();
        System.out.println(getName() + " stood up.");
    }
}

class Female extends Human {
    public void goPee() {
        super.goPee();
        System.out.println(getName() + " sat down.");
    }
}
于 2012-04-26T01:36:13.920 回答
0

您的基本问题是您尝试在不存在的 Human 引用上调用方法。

如果您将对象正确地转换为男性或女性对象,那么您会发现您可以调用该方法。由于您的容器只知道您的基类,因此您需要在那里定义方法,然后多态性将调用与 Human 引用相关的类型中的正确定义。(即男性或女性对象)

于 2012-04-26T01:39:37.953 回答