【问题标题】:Instantiate superclass variable in Java在 Java 中实例化超类变量
【发布时间】:2018-01-26 23:02:05
【问题描述】:

我有一个抽象类,其中包含我希望我的子类初始化的变量“名称”。其中哪一个是最好的方法。

选项1.使用超类构造函数进行初始化

    @Getter
    abstract class A {

      private final String name;

      protected A(String name) {
        this.name = name;
      }

    }

    class B extends A {

      private static final NAME = "Raylan";
      private final int age;

      public B(int age) {
        super(NAME);
        this.age = age;
      }

    }

选项 2. 使用 getter 方法。

    abstract class A {

      private final String name;

      public abstract String getName();

    }

    class B extends A {

      private static final NAME = "Raylan";
      private final int age;

      public B(int age) {
        this.age = age;
      }

      @Override
      public String getName() {
        return NAME;
      }

    }

【问题讨论】:

  • 第一个例子中getName在哪里?
  • 你不能强制子类实例化一个类型。您只能强制执行方法(行为)。但不是他们应该如何实现这些方法。因此,您确实可以强制执行一些 getter 方法,例如 getFoo(),但不能强制执行实际的 foo 变量本身。
  • 我添加了一个@Getter 注释。
  • @Zabuza 我认为final 声明会强制构造函数将值设置一次且仅一次。
  • @DavidKnipe 确实如此。如果某个东西被声明为final,它只能设置一次。根据范围(例如成员变量),这需要在构造函数中完成,以确保变量不能再次在其他地方设置。你为什么要对我说这个,我说了什么让你感到困惑?

标签: java class inheritance


【解决方案1】:

A 中拥有私人name 却无法访问它是没有用的。假设A 中有一个功能齐全的getName(),请考虑B 中的多个构造函数:

class B extends A {
  private static final String NAME = "Raylan";
  private final int age;

  public B(String name, int age) {
    super(name);
    this.age = age;
  }

  public B(int age) {
    this(NAME, age);
  }

  public int getAge() {
     return age;
  }

}

这允许重复使用A,否则B 扩展A 似乎没有多大意义。组合,而不是继承,可能是另一种选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多