Suponhamos que eu tenha um objeto Player com N variáveis e métodos. Este objeto player implementa a interface Nameable que tem somente dois métodos (getName e setName). Caso em uma estrutura de código, eu defina:
Nameable nameable = World.getPlayer(“Murilo”);
O espaço alocado pelo objeto “nameable” seria menor do que se eu escrevesse a mesma estrutura da seguinte forma?
O espaço alocado sempre será o espaço necessário para a instância da classe.
Independente se a variável declarada é mais abstrata, o objeto sempre vai ocupar a memória necessária para as instâncias da classe na qual foi realizar a instrução new ConstrutorDaClasse().
Então quando você faz Nameable nameable = World.getPlayer(“Murilo”); o espaço alocado será o espaço necessário para alocar o objeto retornado pelo método getPlayer().
Isso é o que permite que seja feito o cast de uma instância de objeto de uma classe/interface mais abstrata para uma instância de objeto de uma classe mais especializada.
Object obj = new String("Aphonso");
String nome = (String) obj;
Se isso não ocorresse, não seria possível obter os atributos que não fazem parte da classe/interface mais abstrata.