To me the confusion is more with the loop constructs. My mental model is fine with variable capture in general, but I don't interpret loop variables as "real" variables. What I'd intuitively expect, if I didn't already know that most languages don't do it that way, is that the loop variable is freshly bound on each iteration. That expectation is strengthened by the fact that a lot of languages seem not to want to allow you to actually use it as a real variable anyway: you often can't modify the loop variable within a foreach-style loop, which leads me to view them as fresh immutable bindings per iteration.
Admittedly, the Java for loop is a plain C-style for loop, where you actually can modify the loop variable if you wish, so it pretty much has to work that way. But the binding-reuse behavior of, say, Python's for i in range(n) loop makes less sense to me. IIRC, it's also one of the many contentious differences in Common Lisp between the LOOP and ITERATE macro packages.