il problema di fondo è che Java è a tipizzazione forte, mentre PHP è a tipizzazione debole, dal momento che una variabile può essere di qualsiasi tipo in qualsiasi momento, senza dover dichiarare un tipo nel momento in cui dichiari la variabile e senza che questo tipo debba rimanere tale per tutto in cui la variabile è in memoria.

Ora non vorrei dire una mega castroneria, ma se dichiari Animal a = new Dog(); e Dog estende Animal, mi pare che Java faccia un casting implicito ad Animal, quindi in find dei conti dovresti trovarti un'istanza di Animal e non di Dog. Ma non uso Java da un sacco di tempo e questi tricks non me li ricordo bene