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

And*_*tin 0 java inheritance abstract

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

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

public abstract class Airplane {
    String serialNumber;

    public String toString() {
    return getClass().getName() + ": " + serialNumber
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class B747 extends Airplane {
    B747(String serial) {
    serialNumber = serial;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Airplane a = new B747("ABC101");
System.out.println ("Airplane a: " + a);
Run Code Online (Sandbox Code Playgroud)

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

public B747 (String serial) {
    super (serial);
}
Run Code Online (Sandbox Code Playgroud)

在抽象的超级飞机Airplane中,他们有:

public Airplane (String serial) {
    this.serial = serial;
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

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

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

  • 每个人都Aeroplane应该有一个序列号,因此Aeroplane该类强制执行该序列号是有意义的
  • 它允许字段在private(和final)内部Aeroplane,通过"getter"提供对其的只读访问权限.

这两个部分都很重要 - 但如果您不确定第一个方面,请考虑如果您有另外几个子类会发生什么.你真的希望赋值发生在每一个子类中吗?这里将永远是一个超类调用-无论是隐性或显性的-但我们没有理由重复分配.

我这本书的解决方案肯定更喜欢你的一个-特别是如果他们做出领域privatefinal.在我的代码中,除了常量之外,我几乎使用非私有字段.