Reference values like primitive value can be cast and mostly casted during assignment, passing as parameter or via explicit casting. Widening conversions are permited in primitive data types but narrowing conversion must be done explicitly.  In similar way, upcasting ( subtypes to its super type) is allowed  and downcasting (supertype to  subtype) can be done