【问题标题】:Java: How do I create a getter method that gets an object from an inherited class?Java:如何创建从继承类中获取对象的 getter 方法?
【发布时间】:2015-02-21 21:25:04
【问题描述】:

我正在尝试在类 Catalog 中形成对象 Mammal 的 getter 方法。 get 方法没有参数,返回类型为 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;
    }

我知道这是一个非常简单的问题,您不必看到它,只需提供上下文即可。我编写了几个像哺乳动物这样的类,例如Feline、Birds等,并且是作业的最后一部分,Catalog,一系列get方法。我只需要getMammal、getBirds、getFeline,返回类型要么是Mammal,要么是Birds[]等。所以对象本身还是对象数组。我的尝试:

public class Catalogue{
    private Mammal mam;

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

所以我显然不明白在这一步要做什么。任何帮助,将不胜感激!我得到的编译错误是“无效的方法声明;需要返回类型”。我正在尝试几种不同的方式,但似乎无法克服这个错误。

【问题讨论】:

    标签: java class inheritance getter getter-setter


    【解决方案1】:

    我认为你需要的看起来像这样:

    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;
        }
    }
    

    这将创建一个带有实例变量mammalsbirdsCatalogue,并允许您获取这些值。 然后构造一个Catalogue,你调用:

    Catalogue c = new Catalogue(mammal, birds);
    

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

    【讨论】:

      【解决方案2】:

      替换

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

      通过

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

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

      您可能认为这很明显,因为您清楚地返回了Mammal,但Java 是强类型的并且显式

      有些编程语言可以简单地通过检查代码来推断方法的返回类型,但 Java 不是其中之一。

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

      【讨论】:

      • 谢谢,这似乎让我走得更远。但是我现在在这一步失败了,因为它需要一个字符串,字符串,字符串输入参数。所以我尝试 Mammal mam = new Mammal(String firstName, String lastName, String username);但这不起作用?
      • 您的目录类是要生成哺乳动物,还是只是从其他地方检索它们?如果它生成它们,那么由您决定。也许你想创建一个随机分配名字的哺乳动物?
      • 实际上,为什么您的 Catalog 类包含一个 Mammal 类型的实例变量?看来您想在 Catalog 的构造函数中初始化这个 Mammal 实例变量并稍后检索它(您当前正在尝试在每次调用 getter 时创建一个新变量)
      • 我相信目的是从其他地方检索,所以会有一些其他类(我有一个 testCode 类)会调用 getMammal,但是如果 getMammal 没有参数输入,这怎么可能呢?例如,这个目录有一个哺乳动物对象、一个包含 20 只鸟的数组等。我删除了实例变量,但我需要 3 个字符串输入的问题仍然存在
      • 有很多方法可以做到这一点,但基本上你需要为 Catalog 定义一个构造函数,它将一个哺乳动物对象、一个鸟类数组作为输入并将它们设置为 Catalogue 的实例变量。 getter 不能调用 new 关键字。
      【解决方案3】:
      public Mammal getMammal() {
          Mammal mam = new Mammal();
          return mam;
      }
      

      你必须写出你将返回的对象的类型。并在括号中写“新哺乳动物(名字,姓氏,昵称)”

      【讨论】:

      • 能否添加正确调用构造函数的代码示例?
      • 哺乳动物妈妈 = new Mammal("Sheep", "Wilson", "Shep");是我如何在单独的测试代码类中构造哺乳动物对象的示例。尽管我尝试了 public Mammal getMamma() {Mammal man = new Mammal(firstname, lastname,nickname); 但我仍然无法让这个 getMammal 方法工作。返回妈妈;}
      【解决方案4】:

      如果我对您的理解正确,这个目录类应该是创建您创建的所有 Animal 类型的实例的东西。其中一个解决方案很简单,如下所示:

      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);
      

      强制转换是必需的,因为在你的泛型类型中你将返回 Animal,所以这将是泛型的并且适用于所有动物类型。当你调用该方法时,你知道你想要什么样的动物。因为你传递了这个作为构造函数中的参数

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

      编辑:

      为了创建 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;
          }
      

      【讨论】:

      • 所以我正在尝试使用您的第一个解决方案并在编译时不断收到此错误: Mammal 类中的构造函数 Mammal 无法使用给定的类型:|返回新的哺乳动物(); |在新的箭头处,必需:String,String,String found: no arguments
      • 看我的编辑.. 这是因为你需要向 Mammal 添加构造函数
      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      相关资源
      最近更新 更多