什么';在Java中使用父类的类型和子类的实例有什么意义?

什么';在Java中使用父类的类型和子类的实例有什么意义?,java,Java,我正努力想弄明白这一点。在Java中,我可以使用新操作符和子类实例来使用父类类型。 比如说,我有人类家长班和男女儿童班。 我知道他们之间是一种关系,因为男性是人,女性是人。 我知道只有在Human中定义并在Male/Female中重写的方法才能用于Human类型和Male/Female实例。 但问题是:为什么我要使用Human作为男性/女性(儿童)实例的类型 我尝试了一个示例“Types”类,它创建了一个人类类型的男性对象。为了使Male->humanType(或Female->humanTyp

我正努力想弄明白这一点。在Java中,我可以使用新操作符和子类实例来使用父类类型。 比如说,我有人类家长班和男女儿童班。 我知道他们之间是一种关系,因为男性是人,女性是人。 我知道只有在Human中定义并在Male/Female中重写的方法才能用于Human类型和Male/Female实例。 但问题是:为什么我要使用Human作为男性/女性(儿童)实例的类型

我尝试了一个示例“Types”类,它创建了一个人类类型的男性对象。为了使Male->humanType(或Female->humanType)方法能够工作,我必须声明一个不做任何事情的Human->humanType方法。 我所能想到的唯一一件事是,通过这样做,我能够将一个人工参数传递给一个方法(方法签名,即Human h1),该方法是男性或女性的,但为了使该代码正常工作,我必须在Human类中声明我在男性/女性类中声明的所有方法,而在Human类中什么都不做(类似于抽象方法)

这是跑步的好方法吗?
我只是想更好地理解Java提供的这种可能性(我认为它被称为后期/早期绑定),因为我没有完全理解它。抽象类Human不是更正确吗?

您要寻找的词是“多态性”


这里有一个指向的链接。

getHumanType
不会编译,因为
Object
没有定义
humanType()
。我想你的意思是接受
人类
作为一个参数。现在,假设你为
汽车
编写了一个类,并希望它接受人。你不想在设计汽车时指定汽车中允许的每种类型的人——围绕
人类
类型建造汽车,汽车将能够接受所有人类,联邦应急管理局le或male。@VinceEmigh:你说得对:方法签名是
getHumanType(Human-Human)
。我刚刚粘贴了一个错误的签名。问题仍然是一样的。看看这个:你应该总是编程到一个接口,而不是实现。你的接口(im Java:接口或抽象类)定义您编程所依据的契约。实现应该是隐藏的,以便您可以将其更改为接口的另一个实现。本教程对我已经知道的理论没有任何补充,我在上一篇文章中发表了自己的观点。我确实理解多态性是什么,但我不明白为什么要编写Animal a1=new Dog或Human h1=新男性,而不是使用子类型。问题是为什么,而不是如何。@saga语句,如
Human h=new Male()
据我所知,没有任何用处。当实际变量在其他地方定义时,如方法参数或字段成员,此功能非常有用。如果我们有字段或方法参数
列表
,我们可以随时更改使用的值。如果您被告知为
汽车
编写类,但没有被告知类型是什么实体的集合将在汽车中,您将定义一个类型
CarEntity
,并围绕该类型构建您的类。然后其他实体将从该类型派生。您可以编写
car
,而无需知道汽车中到底会发生什么。
class Types {

  public static void main(String[] args) {

    Types t1 = new Types();
    Human p1 = new Male("Ugo");

    t1.getHumanType(p1);

  }


  public void getHumanType(Human human) {
    human.humanType();
  }

}

class Human {
  String name;

  Human(String name) {
    this.name = name;
  }

  public void humanType() { }
}

class Male extends Human {

  Male(String name) {
    super(name);
  }

  public void humanType() {
    System.out.println("Im a Male");
  }

}

class Female extends Human {

  Female(String name) {
    super(name);
  }

  public void humanType() {
    System.out.println("Im a Female");
  }

}