【发布时间】:2016-04-02 03:46:56
【问题描述】:
例如,当我有一个类 Rectangle 和一个类 Square。如果类 Square 扩展了 Rectangle,则类 square 是类 Rectangle 的子类。现在说我有代码。 Rectangle shape = new Square(5,6);
我将创建一个对象,但它是 Rectangle 类型,但是使用 square 的构造函数还是 Square 的对象?我的困惑始于类 Square 具有类 Rectangle 的相同方法,但它将使用类中的方法正方形不是矩形类。那么我是否创建了一个 Square 对象,但类型为 Rectangle?
评论:每个人都在生气,因为知道正方形不会扩展矩形,但这是我的老师的示例,纯粹展示了继承,事实上,最后他展示了如果我们使用这段代码,它会产生错误。
【问题讨论】:
-
顺便说一句,
Square extends Rectangle可能不是一个好主意。虽然在几何中,正方形确实是矩形,但就 API 而言,它们不是。一个矩形可能有setHeight和setWidth方法,假设设置一个不会影响另一个。但是像setLength一样的Square,它会同时影响高度和宽度。即使您让它们共享方法名称,其行为也足够不同,以至于让 Square 扩展 Rectangle 可能并不好。 -
@yshavit:只要长宽相等,原则上正方形和长方形没有什么区别。
-
@Makoto 如果您有一个宽度=5 和高度=5 的
Rectangle rect,并且您调用了rect.setHeight(2),您希望rect.getWidth()是什么?我希望它保持在 5,而不是更改为 2。现在,仔细阅读 JavaDocs 可能会发现“更改宽度可能会也可能不会更改高度”之类的内容,但是 (a) 那是@987654321 @ 和 (b) 这使得你的程序更难推理,因为你必须在脑海中保留更多的“也许”。 -
@yshavit:这就是为什么如果你真的想要一个正方形,你会使用更具体的
Square。我要说的是,从几何(和可能的实现)意义上讲,只要矩形的长度和宽度相等,那么它就与正方形没有什么不同。 (我的直接偏好是让形状然后 不可变 这样你就不会得到那些不稳定的行为,但是......) -
yshavit 关于它不是一个好主意的说法是有道理的如果类是可变的 - 也就是说,如果你的
Rectangle真的要提供以下能力在运行时更改其大小。但是在很多应用程序中,它是不可变的——你在构建它时设置了高度和宽度,并且不提供以后更改它们的方法。道德:当您考虑类是否应该是不可变的时,您需要考虑是否要扩展这样的类。
标签: java object types subclass hierarchy