0

首先,我希望我的问题措辞足够好。如果没有,请随时对其进行编辑或提出更改建议。
我正在阅读 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;
}

这只是个人喜好问题,将 String 提升到超类并在那里对其进行操作,或者这是否提供任何好处,无论是安全性还是其他方面?

4

2 回答 2

8

这只是个人喜好问题,将 String 提升到超类并在那里对其进行操作,或者这是否提供任何好处,无论是安全性还是其他方面?

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

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

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

我绝对更喜欢这本书的解决方案而不是你的解决方案——特别是如果他们在这个领域privatefinal. 在我的代码中,除了常量之外,我几乎从不使用非私有字段。

于 2013-02-07T23:07:43.513 回答
0

另外 super() 只是对超类构造函数(Aeroplane)的调用,在创建类层次结构时(据我所知)您调用超类构造函数是常见的做法。有像“this”和“super”这样的关键字,它们定义了它是否是层次结构中的超级/子(子)类中的值。Java 通常知道您是否只是简单地编写字段值名称,但它实际上是在秘密地为您放入“this”部分。

于 2013-02-07T23:19:53.433 回答