使用super将变量提升为抽象超类是否比在子类中赋值更有益?

时间:2013-02-07 23:05:47

标签: java inheritance abstract

对于初学者,我希望我已经说得好。如果没有,请随时编辑或建议更改 我正在通过Java教科书来帮助我的大学课程,我遇到了一个练习,要求我创建一个abstract class飞机,有三个子类,B747,B757和B767。这三个子类的每个对象都有一个唯一的序列号。

删除了问题的其他很多部分(我希望这些部分不相关!),我这样做了:

public abstract class Airplane {
    String serialNumber;

    public String toString() {
    return getClass().getName() + ": " + serialNumber
    }
}

然后我宣布了三个子类,每个子类看起来像这样:

public class B747 extends Airplane {
    B747(String serial) {
    serialNumber = serial;
    }
}

最后,在我的主程序中,我使用以下代码实例化了新对象:

Airplane a = new B747("ABC101");
System.out.println ("Airplane a: " + a);

现在,代码工作正常。但是,当我查看书中的答案时,他们选择以不同的方式进行。他们以相同的方式实例化每个对象,但是在每个类中都有以下方法:

public B747 (String serial) {
    super (serial);
}

在抽象超级班飞机中,他们接着:

public Airplane (String serial) {
    this.serial = serial;
}

这只是个人偏好的问题,将字符串提升为超类并在那里采取行动,或者这是否提供任何好处,无论是安全还是其他方面?

2 个答案:

答案 0 :(得分:8)

  

这只是个人偏好的问题,将字符串提升为超类并在那里采取行动,或者这是否提供任何好处,无论是安全还是其他方面?

它只会改变访问变量的位置 - 而不是声明它的位置。这是一件好事:

  • 每个Aeroplane都应该有一个序列号,因此Aeroplane类强制执行
  • 是有意义的
  • 它允许private(和final)字段在Aeroplane内,并且“getter”可以根据需要提供对其的只读访问权

这两个部分都很重要 - 但如果您不确定第一个方面,请考虑如果您有另外几个子类会发生什么。你真的希望赋值发生在每一个子类中吗? 总是是超级构造函数调用 - 无论是隐式还是显式 - 但没有理由重复赋值。

我绝对更喜欢这本书的解决方案 - 尤其是当他们创建字段privatefinal时。在我的代码中,除了常量之外,我几乎永远使用非私有字段。

答案 1 :(得分:0)

此外,super()只是对超类构造函数(Airplane)的调用,通常的做法就是创建一个类层次结构(就我所知)你调用超类构造函数。有像“this”和“super”这样的keywrod定义它是否是层次结构中super / sub(child)类中的值。 Java通常知道你是否只是简单地写了字段值名称,但它实际上是秘密地将“this”部分放在那里。