【问题标题】:Calling a subclass constructor with a variable affecting the super constructor使用影响超级构造函数的变量调用子类构造函数
【发布时间】:2020-01-18 02:35:16
【问题描述】:

我正在尝试创建一个类 Mammals 扩展抽象类 Animals,它可以从 main 方法调用,其中 int 确定 String 物种包含的内容。但是,整数不会以任何方式影响下面我的代码中的字符串,因为对超级构造函数的调用必须是子类构造函数中的第一条语句。如何使用“实际”字符串再次调用超级构造函数?我已经尝试在子类中创建一个重载的构造函数并首先调用它,但这似乎不起作用。

public abstract class Animals {
  protected String species;
  public Animals(String species) {
    this.species = species;
  }
}
class Mammals extends Animals{
  static String species;
  public Mammals(int speciesNumber) {
    super(species);
    if(colorNumber == 0){
      species = "Dog";
    }
    else if(speciesNumber == 1){
      species = "Cat";
    }
    else if(speciesNumber > 1){
      species = "Horse";
    }
  }
}

【问题讨论】:

    标签: java inheritance subclass


    【解决方案1】:

    一旦你传递了一个值,你就传递它。稍后更新值不会影响您之前给它的值。不过很容易解决:

    class Mammals extends Animals {
        public Mammals(int speciesNumber) {
            super(toSpeciesName(speciesNumber));
        }
    
        private static  String toSpeciesName(int speciesNumber) {
            // your if/elseif block here, or probably just a switch/case block.
        }
    }
    

    注意:不要像这样重复字段;如果您的父类有一个名为species 的字段,请不要在子类中创建另一个名称为species 的字段。你没有覆盖任何东西,你有 2 个完全不相关的字段,其中一个是“阴影”的,并且很难访问。糟糕的计划。此外,将其设为静态也很奇怪。也不要那样做。这意味着制作不止一个会失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2021-11-23
      • 2021-09-19
      相关资源
      最近更新 更多