Instead of using confusing names like "Testing" and "ASCI", let's use some names that help us think about the problem. How about "Animal" and "Dog". A Dog is a kind of animal, right? Also, a Cat is another kind of Animal. So this is legal:
But this is not legal
In the second example, we're actually smarter than the compiler. We know that "a" is pointing to a Dog, but the compiler does actually know that; it just knows that it might not be a Cat, and so the second assignment is not legal. You can force the compiler to listen to you using a cast:
The compiler will compile the program this time, but when you run it, you'll get a ClassCastException -- an error that says, basically, you lied to the compiler, and told it "a" contained a Cat, when it did not.
One thing to keep in mind about casts is: Casting does not do any kind of automatic conversion*. The only thing that is means is that you are telling the compiler: "Look, I have this object of type X here, but I know that it's really an Y, so I want you to treat it as if it is an Y - don't complain about it". Note that the type of the object will still be checked - but at runtime instead of at compile time.
Since it's always better to catch errors as early as possible, you'll want to avoid casting as much as possible in your programs - because it's delaying a possible error from compile time to runtime.
* Actually, when casting between primitive types, for example from float to int, a conversion is done. But for non-primitive types, there are no automatic conversions.