== 1. Copy constructor: new object, own list, final fields intact == rex = Dog(Rex, [sit, roll]) bark=7 rex2 = Dog(Rex, [sit, roll]) bark=7 rex2.tricks == rex.tricks : false == 2. The static type picks the constructor, so a subtype is sliced off == new Animal(pet) = Animal(Rex, [sit, roll]) == 3. A virtual copy() keeps the runtime type == pet.copy() = Dog(Rex, [sit, roll]) bark=7