问题 问答题


阅读下列说明、图和Java代码,回答问题1至问题3。
【说明】
已知四个类之间的关系如图2-4所示,分别对每个类的方法进行编号,例如Shape的perimeter()为1号,表示为1:perimeter(),Rectangle类的perimeter()为2号,表示为 2:perimeter(),依此类推,其中,每个类的perimeter方法签名相同。


【Java代码】
Triangle tr=new Triangle();
Square sq=new Square();
Shape sh=tr;

【问题3】 下列赋值语句中哪两个是合法的(写出合法赋值语句的编号)。
①sq=sh; ②sh=tr; ③tr=sq; ④sq=tr; ⑤sh=sq;

答案

参考答案:

解析:② ⑤

[分析]: 根据Java代码: Triangle tr=new Triangle(); Square sq=new Square(); Shape sh=tr; 可以得出下面的结论:tr引用一个Triangle对象,sq引用一个Square对象,sh和tr引用同一个Triangle对象。因此,对问题1给出的论断,sh和tr引用同一个对象,其引用的内存空间也是相同的,①和⑤正确。对于论断④,由于sh和tr引用同一类型的同一个对象,因此不存在不同的备份。 根据题目的描述,我们知道perimeter是虚拟函数,所以所有通过sh调用的perimeter都将实际调用Triangle类的perimeter方法。 ·tr->height():因为订引用一个Triangle对象,所以调用Triangle类的height方法。 ·sh->perimeter():因为sh引用的是一个Trangle对象,所以调用Triangle类的 perimeter方法。 ·sq->height():因为sq引用的是Square对象,但Square类并没有height方法,所以未对应任何方法调用。 ·sq->perimeter():因为sq引用的是Square对象,所以调用Square类的perimeter方法。 ·sh->height():虽然sh引用的是一个Trangle对象,sh中并未定义height方法,所以此调用错误。 ·tr->perimeter():因为tr引用一个Triangle对象,所以调用Triangle类的perimeter方法。 问题3主要考虑类型的问题,我们只能够将子类类型的实例或引用赋值给父类类型的变量或引用。因此,赋值运算的左边一定是右边的父类或同一类型。正确的只有②和⑤。

选择题
单项选择题