If the lookup process for an identifier resolves such a variable, then it will always resolve to the same variable, regardless of the (static or dynamic) context of the function body. Thus the identifier expression is indeed statically bound in that case.
Exactly. And that's how my intuition thinks a "constant" should work as well.
I think it's right that the "constant" keyword controls read-onlyness without affecting binding.
"constant" isn't just a modifier, it's its own type of entity. If it had been "constant int x=7;" then I agree that it should only differ from "int x=7;" in read-onlyness. But since it is different from an instance variable, I don't see any problem with it having different binding from an instance variable, just like a local variable has a different binding from an instance variable.