Hello Dave,
casting an object does not mean to change the class-type of the object. It only says to the compiler: "Even if you cannot see that this object I want to use is an instance of class C, I assure you, at runtime, it will be." That's all.
So one of the most common uses of casting is working with the objects of a collection, for example of an ArrayList. If *you* know that in the ArrayList there are only, let's say String objects, you tell the compiler by casting that the following operation is allowed:
Without the cast, the trim method would not be allowed, because from the sight of the compiler, in an ArrayList there are only "Objects".
So in your example the cast is only to irritate one. r is an instance of Runtime, and because Runtime extends class Base, r is an instance of Base (in the sense of instanceof), too. But: The method wich is called depends on the runtime type (this is why the class is called runtime, knick knack), so: on the type r.getClass() would return. And that is, no matter if you use the cast or not - Runtime.
So it's 10,10.
Hope it helps
Detlev