What is the difference between up-casting and down-casting with respect to class variable

后端 未结 10 1959
暗喜
暗喜 2020-11-22 09:55

What is the difference between up-casting and down-casting with respect to class variable?

For example in the following program class Animal contains only one method

10条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-22 10:13

    Upcasting is casting to a supertype, while downcasting is casting to a subtype. Upcasting is always allowed, but downcasting involves a type check and can throw a ClassCastException.

    In your case, a cast from a Dog to an Animal is an upcast, because a Dog is-a Animal. In general, you can upcast whenever there is an is-a relationship between two classes.

    Downcasting would be something like this:

    Animal animal = new Dog();
    Dog castedDog = (Dog) animal;
    

    Basically what you're doing is telling the compiler that you know what the runtime type of the object really is. The compiler will allow the conversion, but will still insert a runtime sanity check to make sure that the conversion makes sense. In this case, the cast is possible because at runtime animal is actually a Dog even though the static type of animal is Animal.

    However, if you were to do this:

    Animal animal = new Animal();
    Dog notADog = (Dog) animal;
    

    You'd get a ClassCastException. The reason why is because animal's runtime type is Animal, and so when you tell the runtime to perform the cast it sees that animal isn't really a Dog and so throws a ClassCastException.

    To call a superclass's method you can do super.method() or by performing the upcast.

    To call a subclass's method you have to do a downcast. As shown above, you normally risk a ClassCastException by doing this; however, you can use the instanceof operator to check the runtime type of the object before performing the cast, which allows you to prevent ClassCastExceptions:

    Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
    if (animal instanceof Dog) {
        // Guaranteed to succeed, barring classloader shenanigans
        Dog castedDog = (Dog) animal;
    }
    

提交回复
热议问题