Formal Underpinnings of Java