对于初学者,我希望我已经说得好。如果没有,请随时编辑或建议更改
我正在通过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;
}
这只是个人偏好的问题,将字符串提升为超类并在那里采取行动,或者这是否提供任何好处,无论是安全还是其他方面?
答案 0 :(得分:8)
这只是个人偏好的问题,将字符串提升为超类并在那里采取行动,或者这是否提供任何好处,无论是安全还是其他方面?
它只会改变访问变量的位置 - 而不是声明它的位置。这是一件好事:
Aeroplane
都应该有一个序列号,因此Aeroplane
类强制执行private
(和final
)字段在Aeroplane
内,并且“getter”可以根据需要提供对其的只读访问权这两个部分都很重要 - 但如果您不确定第一个方面,请考虑如果您有另外几个子类会发生什么。你真的希望赋值发生在每一个子类中吗? 总是是超级构造函数调用 - 无论是隐式还是显式 - 但没有理由重复赋值。
我绝对更喜欢这本书的解决方案 - 尤其是当他们创建字段private
和final
时。在我的代码中,除了常量之外,我几乎永远使用非私有字段。
答案 1 :(得分:0)
此外,super()只是对超类构造函数(Airplane)的调用,通常的做法就是创建一个类层次结构(就我所知)你调用超类构造函数。有像“this”和“super”这样的keywrod定义它是否是层次结构中super / sub(child)类中的值。 Java通常知道你是否只是简单地写了字段值名称,但它实际上是秘密地将“this”部分放在那里。