当前位置: 首页 > 知识库问答 >
问题:

Java:用Java创建特定子类对象

熊嘉茂
2023-03-14

假设我在Java中有一个类Animal和3个子类。结构如下所示

class Animal{
  ...
  public breed(){
    //create a new child class object here
  }
}

class Bird extends Animal{
  ...
}

class Bear extends Animal{
  ...
}
class Frog extends Animal{
  ...
}

我想在breed类中创建另一个对象,但我想创建同一个子类的对象,方法breed()就是从这个子类执行的。例如,如果执行了Frog.breed(),我想在那里创建一个新的Frog对象(因为summing Frog是一个Frog对象),如果执行了bear.breed(),我想创建一个新的bear对象,等等。

有没有办法在动物类中处理,或者我必须在每个子类中重写方法?

共有1个答案

西门正平
2023-03-14

这是可能的,如果您传递一个引用到一个函数。我怀疑方法引用和将函数作为参数传递可能有点超出了您现在的水平,但这并不复杂。

class Animal {
  private final Supplier<Animal> ctor;

  Animal(Supplier<Animal> ctor) {
      this.ctor = ctor;
  }

  public Animal breed() {
    return ctor.get();
  }
}

class Bird extends Animal {
  public Bird() {
    super(Bird::new);
  }
}

重写的优点是Java允许您使返回类型更具体。因此,如果您有bird bird;,您可以执行bird chick=bird.breed();

class Bird extends Animal {
  public Bird breed() { //super return type is Animal, this return type is more specific
    return new Bird();
  }
}

如果不重写,就不能使返回类型更具体,因此必须将其赋给animal chick=bird.breed()类型的变量,除非要强制转换它。

 类似资料:
  • 问题内容: 因此,我是一名学生,正在学习Java。有一个概念让我难以把握,希望有人可以为我提供一些启示。我的问题是关于多态性。例如,假设我有以下代码。 据我了解,由于变量类型是Animal,所以a将具有Animal的所有特征。但是,由于创建的对象是蜥蜴,因此将使用Lizard类中的所有重写方法,而不是Animal类中的方法。这是正确的吗? 另外,在创建时将使用哪个类构造函数? 谢谢你的帮助。我看起

  • 例如:对于一个测试输入,它们必须是3个对象才能创建名称为v0、v1、v2,而对于其他测试输入,它们必须是5个对象才能创建名称为v0、v1、v2、v3、V4。 下面给出了5个对象的静态程序: 我想让它变得动态,比如k=5(对象的数量):

  • 问题内容: 我正在尝试将由IP地址或名称指定的地址(都以String(即或))转换为 InetAdress 对象。没有构造函数,而是返回 InetAddress的 静态方法。因此,如果我获得了主机名,这不是问题,但是如果获得IP地址该怎么办?有一种方法可以获取 byte [], 但是我不确定这对我有什么帮助。所有其他方法均获取主机名。 InetAddress API文档 问题答案: 您应该可以使用

  • Class类提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。在Java中枚举类是一种类,而注解是一个接口,数组也是一个类;Java原始类型(boolean, byte, char, short, int, long, float, and double)和关键字void也被表示为Class的对象。

  • 问题内容: 我想在某些数据库更改后在运行时重新创建(新对象)特定的Bean(不重新启动服务器)。看起来就是这样- 此类代码不会运行,因为Spring是由Singleton创建的对象,除非重新启动服务器,否则其上下文不会刷新。如何刷新(创建一个新对象)? 我想到的一种不好的方法是在内部创建新对象,但这对我来说似乎不对。 问题答案: 在DefaultListableBeanFactory中,您具有公共

  • 问题内容: 我的经验表明,使用Java创建对象非常缓慢。通常,我只通过删除对象创建并重复使用相同的对象来优化代码。 我想知道它在基于OOP的其他语言中是否同样慢,因为对我而言,以硬性面向对象的语言花费大量时间来创建对象是非常直观的。 有人在几种语言上对此进行了介绍吗? 问题答案: 尝试看看您从中得到了什么-进行一些练习以尝试使VM无法优化循环: 我有 创建4000000个对象耗时678毫秒 每个对