пример явного приведения типов в Java

Я сталкивался с этим примером на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 как (Truck), почему в комментарии говорится, что это успешное явное приведение от родителя к потомку? Как я понимаю, приведение (неявное или явное) изменит только объявленный тип объекта, но не фактический тип (который никогда не должен изменяться, если вы фактически не назначите новый экземпляр класса для ссылки на поле этого объекта). Если hv уже был назначен экземпляр класса HeavyVehicle, который является суперклассом класса Truck, то как тогда это поле может быть преобразовано в более конкретный подкласс под названием Truck, который выходит из класса HeavyVehicle?

Насколько я понимаю, приведение служит для ограничения доступа к определенным методам объекта (экземпляра класса). Следовательно, вы не можете привести объект к более конкретному классу, который имеет больше методов, чем фактический назначенный класс объекта. Это означает, что объект может быть приведен только как суперкласс или тот же класс, что и класс, из которого он был фактически создан. Это правильно или я здесь не прав? Я все еще учусь, поэтому я не уверен, что это правильный взгляд на вещи.

Я также понимаю, что это должно быть примером понижения рейтинга, но я не уверен, как это на самом деле работает, если у фактического типа нет методов класса, в который этот объект понижается. Изменит ли явное приведение каким-либо образом фактический тип объекта (а не только объявленный тип), так что этот объект больше не является экземпляром класса HeavyVehicle, а теперь становится экземпляром класса Truck?

Ответы на вопрос(6)

Ваш ответ на вопрос