If you check the Boolean class' API you will see that there are two instances of the class Boolean that are "readymade". One is a wrapper for true and the other is a wrapper for false. One of these two instances is returned by all of the valueOf methods. That's why "b1 == b2" and "b3 == b4" are true in the example. In fact all of b1, b2, b3, b4 refer to the same wrapper object representing true.
Again referring to the API, if you really want a new Boolean instance, independent of the two readymade ones, you should use the Boolean constructor. Boolean b5 = new Boolean(true). This results in a Boolean wrapper object such that b5 != b1 (or b2, b3, b4).
The API tells you all that and more besides. [ September 23, 2005: Message edited by: Barry Gaunt ]