Q:

Java inheritance question: What's the difference and why ? What advantages and flexibility does this give a programmer?

If I have a class called CountDownClock and it extends thread, and in another class I declare this:
Thread clock = new CountDownClock();

is that any different than:
CountDownClock clock = new CountDownClock();

if so what is the difference and pros/cons?
In the latter of the two declarations, can I still call parent methods?

A:

If the use of the clock variable relies only on the methods that Thread provides, than the former alternative is better, as it makes less assumptions about the particular object it refers to.
If the use of clock relies on CountDownClock-specific methods, then obviously the latter one is your only option.
The rule of thumb is basically to always choose the most general type possible when declaring a variable.
The same reason applies for preferring
List<String> someList = new ArrayList<String>();

over
ArrayList<String> someList = new ArrayList<String>();

What's the difference and why?

If the program compiles with any of the two alternatives, then technically there's no difference at all. The difference between the two is more related to maintenance. See below.

What advantages and flexibility does this give a programmer?

If clock is only used as a regular Thread, then choosing the first declaration makes it simpler to swap it for a different thread class in the future. (If it is declared as a Thread then you can be sure that it will compile fine for any other Thread class other than CountDownClock.)
Related question:

Type List vs type ArrayList in Java

