Java:如何创建从继承的 class 获取对象的 getter 方法?

Java: How do I create a getter method that gets an object from an inherited class?

我正在尝试为 class 目录中的哺乳动物对象构建 getter 方法。 get 方法没有参数,并且具有 return 类型 Mammal (?)

public class Mammal extends Animal {
    private double intellect;
    private double hitpoints;

    public Mammal(String firstName, String lastName, String nickname) {
        super(firstName, lastName, nickname);
    }

    public void setIntellect(double intellect) {
        this.intellect = intellect;
    }

    public void setHitpoints(double hitpoints) {
        this.hitpoints = hitpoints;
    }
    public double getIntellect() {
        return intellect;
    }
    public double getHitpoints() {
        return hitpoints;
    }

我知道这是一个非常简单的问题,您不必看到它,只需提供上下文即可。我编码了几个class像Mammal,比如Feline,Birds等等,是assignment的最后一部分,Catalog,一系列的get方法。我只需要 getMammal、getBirds、getFeline,并且 return 类型是 Mammal 或 Birds[] 等。所以对象本身或对象数组。我的尝试:

public class Catalogue{
    private Mammal mam;

    public getMammal() {
       Mammal mam = new Mammal();
       return mam;
    }
}

所以我显然不明白在这一步要做什么。任何帮助,将不胜感激!我得到的编译错误是 "invalid method declaration; return type required"。我正在尝试几种不同的方法,但似乎无法克服这个错误。

替换

public getMammal() {
   Mammal mam = new Mammal();
   return mam;
}

来自

public Mammal getMammal() {
   Mammal mam = new Mammal();
   return mam;
}

您需要明确定义 return 类型的 getter 方法,以及任何非构造方法。

你可能认为这是显而易见的,因为你很清楚 return正在 Mammal,但是 Java 很明显 [=26] =]明确输入。

有些编程语言可以通过检查代码推断出方法的 return 类型,但 Java 不是其中之一。

例如,Scala 是强类型的,但通常可以推断出 return 类型的方法。

public Mammal getMammal() {
    Mammal mam = new Mammal();
    return mam;
}

您必须写出您将 return 的对象类型。并写在括号 "new Mammal(firstName,lastName,nickname)"

如果我对你的理解正确的话,这个目录 class 应该可以创建你创建的所有动物类型的实例。其中一个解决方案很简单,就像:

public class Catalogue{

    public Mammal getMammal() {
       return new Mammal();
    }
}

您不需要 Catalog 来保存实例。另一个通用解决方案是:

public class Catalogue{

    public static Animal getAnimalByType(Class type) {
       return type.newInstance();
    }
}

当你调用它时你会知道类型..所以这将是通用的。

Mammal m = (Mammal) Catalogue.getAnimalByType(Mammal.class);

强制转换是必需的,因为在你的通用类型中你将 return 动物,所以这将是通用的并且适用于所有动物类型。当你调用该方法时你知道你想要哪种动物.. 因为你将它作为参数传递给构造函数

希望对您有所帮助。当然,这可以更复杂,但现在就可以了。

编辑:

为了创建 Mammal 的新实例,您还需要添加构造函数:

public class Mammal extends Animal {
    private double intellect;
    private double hitpoints;

    public Mammal() {
        super();
    }

    public Mammal(String firstName, String lastName, String nickname) {
        super(firstName, lastName, nickname);
    }

    public void setIntellect(double intellect) {
        this.intellect = intellect;
    }

    public void setHitpoints(double hitpoints) {
        this.hitpoints = hitpoints;
    }
    public double getIntellect() {
        return intellect;
    }
    public double getHitpoints() {
        return hitpoints;
    }

我想你需要的是这样的:

public class Catalogue 
{
    private Mammal mammal;
    private Bird[] birds;
    public Catalogue(Mammal mammal, Bird[] birds)
    {
       this.mammal = mammal;
       this.birds = birds;
    }
    public Mammal getMammal()
    {
     return mammal;
    }
    public Bird[] getBirds()
    {
      return birds;
    }
}

这会创建一个 Catalogue,其中包含实例变量 mammalsbirds,并允许您获取这些值。 然后构造一个Catalogue,你调用:

Catalogue c = new Catalogue(mammal, birds);

其中 mammalMammal 的实例,birdsBird[] 的实例。