toString method returns some String representation of an object. In your own classes you could override this method to return some useful information. Look at Thread. In general it returns some internal address of that reference. I'm not sure what you mean by explicitly typecasting. Maybe it is useful when you are working with collections.
You cannot change the type of an object. You can cast a reference type in order to create a reference of a different type. This doesn't change the original reference, and it certainly has no effect on any object being referred to.
As already pointed out, the only situation where ref.toString() == ref would be true, would be when ref refers to an object of type String. (ref could be of type String, Object, Serializable, Comparable or CharSequence.)