This has nothing to do with Runnable. Rather, this compiler error results because the expression on the right-hand side of the assignment happens before the assignment.

In this case, the compiler doesn't have a trivial way of knowing if r is definitely assigned if/when the variable expression is actually executed and thus forbids the access entirely.

Each local variable (§14.4) and every blank final field (§4.12.4, §8.3.1.2) must have a definitely assigned value when any access of its value occurs.

Consider the following which illustrates the issue and fails with the same compiler error as the originally posted example.

final String r = (new Object() { public String toString() { // -> error: variable r might not have been initialized // (And in this case it is indeed *not* assigned!) return "Hello " + r + "!"; } }).toString();

Reply to Dog's comment:

.. This was my thought exactly, when I came across the error today. But I can't think of any reason why it doesn't just assume r is defined by the time the interface implementation is defined.

In the above example a case is shown where the variable r is definitely accessed before it is assigned. Likewise, if the constructor called a virtual method (say run ) then it could be accessed before it is assigned - but this case can't be detected across a compilation unit.