First, I guess it is a typo:
address = new HomeAddress((HomeAddress) p.address);
Second, instead of casting the object, you can define a copy() method in Address class, (could be) abstract:
abstract class Address {
abstract Address copy ();
}
And you implement the method in each of the subclasses of Address, then you can call it in the constructor of Person:
public Person(Person p)
{
name = new String(p.name);
address = p.address.copy();
}