Тип ссылки и тип объекта
Я наставляю коллег OCA-Java 7 Certification. Он также посещал курс и проводил там экзамен на подготовку. Один из вопросов касался ссылок и типов объектов. Вот код:
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 Тип ссылки - "Мобильный", тип объекта - "Грузовик"
- D Тип ссылки - "Автомобиль", тип объекта - "Мобильный"
Ответ B помечен как правильный ответ... но ответ IMHO C прав. Кто здесь не прав?!
Ответы
Ответ 1
Что здесь не так?
Отпечатанный ответ в вашей книге/материале здесь неправильный: p
Эталонная переменная theMobile
типа Mobile
относится к объекту типа Truck
.
Итак, ответ 3 верен, тип ссылки Mobile
и тип объекта Truck
.
Вы можете проверить тип объекта с помощью theMobile.getClass()
, который вернет Truck
, а ссылочный тип - это то, что статически объявлено в вашем коде, что Mobile
в объявлении Mobile theMobile = ...
.
Ответ 2
Я никогда не видел эти термины, используемые для этого, но я предполагаю, что они подразумевают тип объявленного типа vs.
Mobile theMobile = theVehicle;
У переменной есть объявленный тип Mobile
и тип времени выполнения Truck
. Ответ C верен.
Тип ссылочного типа относится к любому типу в Java, который не является примитивным, а не типом null
.
Ответ 3
theTruck
является Truck
. Поскольку Truck
продолжается Vehicle
, когда вы говорите Vehicle theVehicle = theTruck
theVehicle
, все равно Truck
. То же самое, когда вы делаете Mobile theMobile = theVehicle
: ваш объект по-прежнему остается Truck
.
EDIT: согласно другому ответу, C является правильным, потому что вы имеете в виду ваш Truck
как Mobile
.
Ответ 4
Правило большого пальца
ссылочная переменная суперкласса может быть назначена подклассу Object
В соответствии с этим правилом Mobile theMobile
может быть присвоено значение vehicle
или Truck
В качестве транспортного средства не создается экземпляр, он также является ссылочным типом
Итак, ответ 3 C Reference type is "Mobile", object type is "Truck"
правильно
Ответ 5
Ответ C. Reference type is "Mobile", object type is "Truck"
правильный. Хотя ссылка указывает на объект Truck в настоящий момент, его можно перемещать, чтобы указать на любой объект, который реализует Mobile или его суб-интерфейс. Таким образом, ссылочным типом является Mobile.
Ответ 6
Существует еще одно правило большого пальца, и оно выглядит примерно так:
Class_Name Reference_Variable = new Class_Constructor()
![enter image description here]()
Итак, фрагмент кода
Truck theTruck = new Truck();
Vehicle theVehicle = theTruck;
Mobile theMobile = theVehicle;
Здесь -
theTruck - это "ссылочная переменная" типа Truck и "Тип объекта" для грузовика
theVehicle - это "ссылочная вариация" типа Vehicle и "Тип объекта" ссылки "Удар", то есть Truck
theMobile является ссылочной переменной "типа Moble и" Тип объекта " ссылки" Транспорт ", которая является Грузовик.
Значит вариант C - правильный ответ.