Я столкнулся с этим примером на http://www.javabeginner.com/learn-java/java-object-typecasting, а в части, где говорится о явном типе, есть один пример, который меня смущает.Явный тип литья пример в java
Пример:
class Vehicle {
String name;
Vehicle() {
name = "Vehicle";
}
}
class HeavyVehicle extends Vehicle {
HeavyVehicle() {
name = "HeavyVehicle";
}
}
class Truck extends HeavyVehicle {
Truck() {
name = "Truck";
}
}
class LightVehicle extends Vehicle {
LightVehicle() {
name = "LightVehicle";
}
}
public class InstanceOfExample {
static boolean result;
static HeavyVehicle hV = new HeavyVehicle();
static Truck T = new Truck();
static HeavyVehicle hv2 = null;
public static void main(String[] args) {
result = hV instanceof HeavyVehicle;
System.out.print("hV is an HeavyVehicle: " + result + "\n");
result = T instanceof HeavyVehicle;
System.out.print("T is an HeavyVehicle: " + result + "\n");
result = hV instanceof Truck;
System.out.print("hV is a Truck: " + result + "\n");
result = hv2 instanceof HeavyVehicle;
System.out.print("hv2 is an HeavyVehicle: " + result + "\n");
hV = T; //Sucessful Cast form child to parent
T = (Truck) hV; //Sucessful Explicit Cast form parent to child
}
}
В последней строке, где T присваивается ссылка кч и напечатанный материал как (грузовик), почему не говорится в комментарии, что это успешный Явная Cast от родителей к ребенку ? Поскольку я понимаю, что кастинг (неявный или явный) изменит только объявленный тип объекта, а не фактический тип (который никогда не должен изменяться, если вы фактически не назначаете экземпляр нового класса для справки об этом объекте). Если hv уже был назначен экземпляр класса HeavyVehicle, который является суперклассом класса Truck, как же тогда это поле может быть введено в конкретный подкласс под названием Truck, который простирается от класса HeavyVehicle?
Как я понимаю, кастинг служит для ограничения доступа к определенным методам объекта (экземпляра класса). Поэтому вы не можете отличать объект как более конкретный класс, который имеет больше методов, чем фактический назначенный класс объекта. Это означает, что объект может быть передан только как суперкласс или тот же класс, что и класс, из которого он был фактически создан. Это правильно или я здесь не прав? Я все еще учился, поэтому не уверен, правильно ли это смотреть на вещи.
Я также понимаю, что это должен быть пример downcasting, но я не уверен, как это работает, если у фактического типа нет методов класса, к которому этот объект опускается. Является ли явное литье каким-то образом изменить фактический тип объекта (а не только объявленный тип), чтобы этот объект больше не являлся экземпляром класса HeavyVehicle, а теперь стал экземпляром класса Truck?
Мы знаем, что высоковольтный грузовик (или суперкласса Грузовика), потому что неявное литье одной линии над обработанным (и это также очевидно из проверки деклараций). Вы всегда можете явно передать реальный тип объекта из ссылки на суперкласс. –
(Кастинг от класса к его суперклассу, чтобы преднамеренно ограничить доступные методы, редко делается. На самом деле, я никогда не вспоминаю об этом. Я полагаю, что это может быть рекомендовано некоторыми «лучшими практиками» гуру, но эти люди редко имеют какое-либо отношение к реальной жизни.) –
'hV = T;' => hV указывает на грузовик сейчас. – njzk2