method vars exist on stack, instance vars exist on heap. Since method local class instances or anonymous instances may be passed out of the method as part of a return value, they are required to exist after the lifetime of the method. The compiler accomplishes this by copy them from stack to heap. How you have a copy of the var on the heap this extends lifetime of the variable beyond the method scope. This stack->heap copy process is only done for final variables so they can exist outside of their method scope.