Я столкнулся с этим примером на http://www.javabeginner.com/learn-java/java-object-typecasting, а в той части, где он говорит о явном типе, есть один пример, который меня смущает.
Пример:
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 присваивается ссылка hV и typecast as (Truck), почему она говорит в комментарии, что это успешный явный ролик от родителя к ребенку? Поскольку я понимаю, что кастинг (неявный или явный) будет изменять только объявленный тип объекта, а не фактический тип (который никогда не должен изменяться, если вы фактически не назначаете новый экземпляр класса этой ссылке на объект). Если hv уже был назначен экземпляр класса HeavyVehicle, который является суперклассом класса Truck, то как это поле может быть введено в конкретный подкласс под названием Truck, который простирается от класса HeavyVehicle?
Я понимаю, что кастинг служит для ограничения доступа к определенным методам объекта (экземпляра класса). Поэтому вы не можете отличать объект как более конкретный класс, который имеет больше методов, чем объект, которому присвоен класс. Это означает, что объект может быть передан только как суперкласс или тот же класс, что и класс, из которого он был фактически создан. Это правильно или я здесь не прав? Я все еще участвую, поэтому я не уверен, что это правильный способ взглянуть на вещи.
Я также понимаю, что это должен быть пример downcasting, но я не уверен, как это работает, если у фактического типа нет методов класса, к которому этот объект опускается. Является ли явное кастинг каким-то образом изменяет фактический тип объекта (а не только объявленный тип), так что этот объект больше не является экземпляром класса HeavyVehicle, а теперь становится экземпляром класса Truck?