我正在阅读Oracle网站上的官方Java教程,我不喜欢在尝试继承时看到的内容。
我创建了一个Bicycle类和一个可以扩展Bicycle的MountainBike类。 MountainBike被迫从自己的构造函数中调用Bicycle的构造函数上的super(),但这就是:
A Bicycle has been created.
A Bicycle has been created.
A MountainBike has been created.
当类看起来像这样(片段)时:
public Bicycle(int speed) {
this.speed = speed;
System.out.println("A Bicycle has been created.");
}
public MountainBike(int seatHeight, int speed) {
super(speed);
this.setSeatHeight(seatHeight);
System.out.println("A MountainBike has been created.");
}
这不是理想的行为。
答案 0 :(得分:4)
有什么缺点? MountainBike
类调用Bicycle
构造函数,因此您将看到“已创建自行车”的输出。在你看到“A MountainBike已被创建”之前。输出。
如果你说你不想看到“已经创建了一辆自行车”。在创建MountainBike
时输出,您可能希望将Bicycle
或MountainBike
的创建包含在另一个知道要显示哪个输出的类中。但基本上你在输出中看到的是你期望看到的MountainBike
也是Bicycle
。
public class BikeWarehouse {
public Bicycle buildBicycle(int speed) {
Bicycle bicycle = new Bicycle(speed);
System.out.println("A Bicycle has been created.");
return bicycle;
}
public MountainBike buildMountainBike(int seatHeight, int speed) {
MountainBike mountainBike = new MountainBike(seatHeight, speed);
System.out.println("A MountainBike has been created.");
return mountainBike;
}
}
或者您可以在toString()
和Bicycle
类中添加MountainBike
方法,然后在创建时,您可以:
System.out.println("A " + bike + " has been created");
显然toString()
的{{1}}会返回Bicycle
而"Bicycle"
的{{1}}会返回toString()
。
我也不经常使用方面,但我相信可以做一些与上面类似的事情,而不会乱丢你的代码库(如果你发现上面的“乱扔垃圾”),但你可能能够登录创建使用AspectJ之类的对象。我通常不是太多基于方面的解决方案的忠实粉丝,但可能需要考虑。
答案 1 :(得分:1)
数目:
这不是缺点。这是一个功能。说真的: - )
将'System.out.println(“已创建XXX”。)'移至受保护的方法,并使用它代替System.out.println的静态调用。