【问题标题】:Java: using setter of a subclass when creating an object of type SuperclassJava:在创建超类类型的对象时使用子类的设置器
【发布时间】:2015-04-07 19:42:42
【问题描述】:

我有一个超类 Person 和两个子类 Man 和 Woman

在子类 Man 中,我有一个实例变量 age:

public class Man extends Person{

   private double age;

   public final static double MIN_AGE = 0.0;
   public final static double MAX_AGE = 65.0;

  //no argument constructor
  public Man(){
    super();
    initAge();  // This randomly selects age
  }

   /* Setters and getters */
   public void setAge (double ageIn) 
   {
      /* Assign a value only if it is within the allowed range */
      if (ageIn>= MIN_AGE && ageIn<= MAX_AGE )
      {
        this.age = ageIn;
      }
      else if (ageIn< MIN_AGE)
      {
        this.age = MIN_AGE;
      }
      else if (ageIn > MAX_AGE)
      {
        this.age = MAX_AGE;
      }
   }

  public double getAge()
  {
    return age;
  }
} 

现在,我的任务是创建一个 Man 对象,并通过显示“age: with getAge”的值来测试 setter 是否有效以及 initAge 是否有效。

我还必须使用以下方法初始化对象:

Person p1 = new Man();

但是,如果以这种方式初始化,我将无法访问 Man 的 setter 和 getter。除了这样做之外还有其他方法吗:

Man p1 = new Man();

谢谢!

【问题讨论】:

    标签: java subclass getter-setter superclass


    【解决方案1】:

    p1 转换为Man

    ((Man) p1).setAge(13);
    

    【讨论】:

      【解决方案2】:

      您可以在 Person 类中添加抽象方法:

      public abstract class Person {
      
          public abstract double getAge();
          public abstract setAge(double ageIn);
      }
      

      或者,如果方法是与性别无关的,则将它们移至父级,以便 Man 和 Woman 可以继承。

      【讨论】:

      • 谢谢。一个好主意,但我不能更改超类。无论如何,感谢您的帮助!
      • 在这种情况下,如果您确定引用是 Man 对象,那么您唯一能做的就是使用强制转换。 if (p1 instanceof Man) ((Man) p1).setAge(42);
      【解决方案3】:

      您将不得不使用Person p1 = new Man();,因为如果您真的不想创建实例化new Man() 的Man 对象,这是唯一的方法。

      现在,为了将 setter 和 getter 作为 Person 访问,您需要通过将 Man 类型转换为它来掩盖它。

      ((Man) p1).setAge(double)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-30
        • 2017-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2015-02-26
        相关资源
        最近更新 更多