Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does a child object lose its unique properties after casting back and forth between a parent class

Consider the following classes:

public class Phone {
    private boolean has3g;

    public boolean has3g() {
        return has3g;
    }

    public void setHas3g(boolean newVal) {
        has3g = newVal;
    }
}

public class Blackberry extends Phone {
    private boolean hasKeyboard;

    public boolean hasKeyboard() {
        return hasKeyboard;
    }

    public void setHasKeyboard(boolean newVal) {
        hasKeyboard = newVal;
    }
}

If I was to create an instance of Blackberry, cast it to a Phone object and then cast it back to Blackberry, would the original Blackberry object lose its member variables? E.g:

Blackbery blackbery = new Blackberry();
blackbery.setHasKeyboard(true);

Phone phone = (Phone)blackbery;

Blackberry blackberry2 = (Blackberry)phone;

// would blackberry2 still contain its original hasKeyboard value?
boolean hasKeyBoard = blackberry2.hasKeyboard();
like image 836
S-K' Avatar asked Apr 25 '13 20:04

S-K'


2 Answers

Casting doesn't change the underlying object at all - it's just a message to the compiler that it can treat an A as a B.

It's also not necessary to cast an A to a B if A extends B, i.e. you don't need to cast a subtype to its supertype; you only need the cast if it's from a supertype to a subtype

like image 132
Zim-Zam O'Pootertoot Avatar answered Nov 18 '22 19:11

Zim-Zam O'Pootertoot


If I was to create an instance of Blackberry, cast it to a Phone object and then cast it back to Blackberry, would the original Blackberry object lose its member variables?

You have instantiated a Blackberry. This will remain a Blackberry until the it is GCed.
When you cast it to Phone you are not changing the fact that the type is Blackberry. You are just treating it as a Phone i.e. you have only access to its generic properties (that of Phone).
The extended properties of Blackberry are no longer visible despite the fact that the concrete instance is still a Blackberry and you can successfully cast it back to access the Blackberry properties.

like image 29
Cratylus Avatar answered Nov 18 '22 19:11

Cratylus