我正在尝试使用继承,以便我可以正确执行测试类中包含的代码。我不确定如何使用goPee()方法实现一个名为Bathroom的抽象类或接口。你知道如何编码吗?
如果我添加一个抽象类或一个接口并分别通过extends或implements将它们添加到Human类,我总是被要求在Human类中为goPee()方法编写实现,我不想这样做do,因为我的goPee()方法实现是在男性和女性子类中编写的。
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();
}
}
}
答案 0 :(得分:7)
您必须在Human类中定义goPee()
方法。由于您在两个子类中都覆盖了它,因此它可以是一个抽象方法。这也意味着人类必须是抽象的。
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()
,因为您知道它们都是实现它。
答案 1 :(得分: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.");
}
}
答案 2 :(得分:0)
您的根本问题是您尝试在不存在的人类参考上调用方法。
如果将对象正确地投射到Male或Female对象,那么您会发现可以调用该方法。由于您的容器只知道您的基类,您需要在那里定义方法,然后多态将在与Human引用相关联的类型中调用正确的定义。 (即男性或女性物体)