2 回答
TA贡献1775条经验 获得超8个赞
在这一行中,您声明它sameObjectDifferentType
是一种类型Rectangle
Rectangle sameObjectDifferentType = blueRectangle;
在更真实的示例中,这将允许您拥有几种不同的类型,您希望以相同的方式对待它们。经典的例子是CurrentAccount
, CheckingAccount
,SavingsAccount
它都继承自Account
.
假设您的银行应用程序具有查找帐户并找出帐户持有人的代码。该代码将只处理抽象Account
类型。这意味着将来当您引入 a 时StudentAccount
,如果它继承自您,则可以在您当前处理 s 的所有地方Account
使用 a ,而无需更改代码。StudentAccount
Account
假设你有一个FilledRectangle
andWireFrameRegtangle
在你的例子中。你可以有一个calculateArea(Rectangle rect)
适用于所有矩形的方法。
但是,您为这种功能和灵活性所做的一个权衡是,当您将对象声明为超类类型时,您将失去直接处理子类属性的能力,因此
sameObjectDifferentType.getColor(); //Won't compile
但是,Java 确实为您提供了一种返回子类的方法,正如您通过强制转换所指出的那样:
((ColoredRectangle) sameObjectDifferentType).getColor(); //Will compile
作为开发人员,您知道这sameObjectDifferentType
确实是一个ColoredRectangle
幕后花絮,因此您可以安全地进行此演员阵容。但是,如果您这样做了
((FilledRectangle) sameObjectDifferentType).getFillPattern();
你最终会得到一个运行时 ClassCastException
希望这可以帮助。
TA贡献1865条经验 获得超7个赞
Rectangle sameObjectDifferentType = blueRectangle;
当你做出这样的声明时,你明确地告诉编译器它应该被视为一个Rectangle
. 虽然在这种情况下它可能是一个ColoredRectangle
,但该保证消失并不需要太多。
添加回答
举报