jawny przykład rzutowania typu w java

Natknąłem się na ten przykładhttp://www.javabeginner.com/learn-java/java-object-typecasting w części, w której mówi o rzuceniu typu jawnego, jest jeden przykład, który mnie wprawia w zakłopotanie.

Przykład:

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
    }
}

W ostatnim wierszu, w którym T ma przypisane referencyjne hV i typecast jako (Truck), dlaczego w komentarzu mówi, że jest to udany rzut bezpośredni z rodzica na dziecko? Jak rozumiem, casting (niejawny lub jawny) zmieni tylko zadeklarowany typ obiektu, a nie rzeczywisty typ (który nigdy nie powinien się zmienić, chyba że faktycznie przypiszesz nową instancję klasy do odwołania do tego obiektu). Jeśli hv ma już przypisaną instancję klasy HeavyVehicle, która jest super klasą klasy Truck, to jak to pole może być wpisane w bardziej specyficzną podklasę o nazwie Truck, która rozszerza się z klasy HeavyVehicle?

Rozumiem, że casting służy ograniczeniu dostępu do pewnych metod obiektu (instancji klasy). Dlatego nie można rzutować obiektu jako bardziej konkretnej klasy, która ma więcej metod niż rzeczywista klasa obiektu. Oznacza to, że obiekt może być rzutowany tylko jako nadklasa lub ta sama klasa, co klasa, z której został faktycznie utworzony. Czy to prawda, czy się mylę? Nadal się uczę, więc nie jestem pewien, czy jest to właściwy sposób patrzenia na rzeczy.

Rozumiem też, że powinien to być przykład downcastingu, ale nie jestem pewien, jak to działa, jeśli rzeczywisty typ nie ma metod klasy, do której ten obiekt jest przetwarzany. Czy jawne rzutowanie w jakiś sposób zmienia rzeczywisty typ obiektu (nie tylko typ zadeklarowany), więc ten obiekt nie jest już instancją klasy HeavyVehicle, ale teraz staje się instancją klasy Truck?

questionAnswers(6)

yourAnswerToTheQuestion