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)
这只是个人偏好的问题,将字符串提升为超类并在那里采取行动,或者这是否提供任何好处,无论是安全还是其他方面?
这只是个人偏好的问题,将字符串提升为超类并在那里采取行动,或者这是否提供任何好处,无论是安全还是其他方面?
它只会改变访问变量的位置- 而不是它声明的位置.这是一件好事:
Aeroplane应该有一个序列号,因此Aeroplane该类强制执行该序列号是有意义的private(和final)内部Aeroplane,通过"getter"提供对其的只读访问权限.这两个部分都很重要 - 但如果您不确定第一个方面,请考虑如果您有另外几个子类会发生什么.你真的希望赋值发生在每一个子类中吗?这里将永远是一个超类调用-无论是隐性或显性的-但我们没有理由重复分配.
我这本书的解决方案肯定更喜欢你的一个-特别是如果他们做出领域private和final.在我的代码中,除了常量之外,我几乎不使用非私有字段.