我指导同事OCA-Java 7认证。他也参加了一门课程并在那里做了准备考试。其中一个问题是关于参考和对象类型。这是代码:
package com.company;
public class Vehicle implements Mobile {
public static void main(String[] args) {
Truck theTruck = new Truck();
Vehicle theVehicle = theTruck;
Mobile theMobile = theVehicle;
}
}
class Truck extends Vehicle {
}
interface Mobile {
}
问题:theMobile
的参考类型和对象类型是什么?
以下是选择:
答案B被标记为正确答案......但恕我直言答案C是对的。谁在这里错了?!
答案 0 :(得分:8)
我从未见过这些用过的术语,但我认为它们的意思是声明的类型与运行时类型。
Mobile theMobile = theVehicle;
变量的声明类型为Mobile
,运行时类型为Truck
。答案C是正确的。
术语引用类型是指Java中不是基本类型而不是null
类型的任何类型。
答案 1 :(得分:5)
这里有什么问题?
你的书/材料中的印刷答案在这里是错误的:p
theMobile
类型的引用变量Mobile
指的是Truck
类型的对象。
所以答案3是正确的,引用类型是Mobile
,对象类型是Truck
。
您可以使用theMobile.getClass()
检查对象类型,该对象类型将返回Truck
,引用类型是代码中静态声明的内容,即Mobile
声明中的Mobile theMobile = ...
。< / p>
答案 2 :(得分:3)
theTruck
是Truck
。由于Truck
延伸Vehicle
,当您说Vehicle theVehicle = theTruck
theVehicle
仍为Truck
时。执行Mobile theMobile = theVehicle
时也是如此:您的对象仍然是Truck
。
编辑:根据另一个答案,C是正确的,因为您将Truck
称为Mobile
。
答案 3 :(得分:1)
拇指规则
超类引用变量可以分配给子类Object
根据该规则Mobile theMobile
可以分配给vehicle
或Truck
由于车辆未实例化,因此它也是参考类型
所以回答3 C Reference type is "Mobile", object type is "Truck"
是正确的
答案 4 :(得分:0)
回答C. Reference type is "Mobile", object type is "Truck"
是正确的。虽然引用此时指向Truck对象,但它可以移动到指向实现Mobile或其子接口的任何对象。因此,引用类型是Mobile。
答案 5 :(得分:0)
还有另一个方便的拇指规则,它就像这样
Class_Name Reference_Variable = new Class_Constructor()
所以这段代码
Truck theTruck = new Truck();
Vehicle theVehicle = theTruck;
Mobile theMobile = theVehicle;
这里 -
theTruck 是&#34;参考变量&#34;类型卡车和&#34;对象类型&#34;卡车
theVehicle 是&#34;参考变量&#34;类型车辆和&#34;对象类型&#34; ofTruck&#34;参考&#34;,即卡车
theMobile 是&#34;参考变量&#34;类型为Moble 和&#34; 对象类型&#34; theVehicle&#34;参考&#34;,即卡车。
所以选项C 是正确答案。