Для выполнения unboxing conversion все команды вида "b1 = true" неявно заменяются на "b1 = Boolean.valueOf(true)". Метод valueOf(), в свою очередь, возвращает заранее созданный объект - Boolean.TRUE. Получается, что переменные b1-b8 ссылаются на один и тот же объект (Boolean.TRUE), а для b9-b11 создаются отдельные экземпляры. Всего получается 4 различных объекта.
1) Call new House("x "); 2) invoke House(String name) {}; - constructor with argument String ; 3)call this(); 4)invoke House(){}; - default constructor 5) call super(); 6)always invoke default constructor Building(){}; - execute code and print "b"; 7)return to House default constructor - execute code and print "h"; 8)return to House constructor with argument String - execute code and print "hn x ", where "x " - paremeter new House("x "); 9)and result "b h hn x "; Выглядит как цепочка! Очень хороший пример
метод *print* класса Print1 не переопределяется методом *print* класса Print2, так как последний даже не знает о существовании такого в классе-родителе (ибо там он private). Эти методы *print* - это 2 разных метода, доступные только каждый в своем классе. Поэтому, в методе *void print(Print1 p)* при вызове метода *print* компилятор находит приватный метод и, зная, что его дальнейшее переопределение невозможно в принципе, вызывает его.