Ok.
[quote=Zeed01]
Mas quando você disse:
[i]“Ei rapaz, pense num animal.”
E depois eu te pergunto:
“Em que animal vc pensou?” [/quote]
O rapaz é vc mesmo. É só para mostrar que nós também usamos classes, no dia-a-dia. Nós podemos classificar qualquer animal como “um animal”, pois também trabalhamos com esse conceito. A ligua permite que nos referenciemos a uma coisa abstrata, embora na prática, iremos nos referir a instâncias concretas. Aliás, nós até trabalhamos com polimorfismo. Eu poderia perguntar para vc:
“Que barulho faz o animal que vc pensou?”
Note que “fazer barulho” é uma característica comum a todos os animais. Por isso, vc responderia “Miau!”.
Isso é equivalente a fazer:
animal.barulho();
E o java imprimir o miau.
A linguagem de programação nos permite a mesma coisa. Quando declaramos uma variável, estamos criando apenas uma referência, um apontador a alguma coisa, do tipo daquela variável. Mas essa coisa sempre terá um tipo específico. No caso de uma variável para animais, um Gato ou um Cachorro. No caso de uma variável para Funcionarios um Gerente ou um Empregado.
[quote]Quando você faz:
Animal animalQuePensei = new Gato();
Não esta explicito que o Animal é um Gato ? [/quote]
Sim, está explicito. Entretanto, o java é burro, limitado, e irá tratar a referência de acordo com o tipo da referência. Pois para ele, a única coisa 100% segura sobre uma variável que guarda um Animal, é que tem um animal lá dentro, não que ele necessariamente é um gato. Claro, como esse código inclui a declaração e a atribuição, fica fácil perceber o que tem dentro da variável. Mas lembre-se que poderia não ser tão claro assim:
[code]public static void mostrarNome(Animal animal) {
System.out.println(“O nome do animal é:” + a);
}
public static void main(String args[]) {
mostrarNome(new Gato());
}[/code]
Aqui, por mais que seja óbvio, fica difícil para o java garantir que a função mostrar nome sempre será chamada com um gato.
Se vc quisesse ali colocar um código específico do gato, seria obrigado a fazer um cast. Como o cast não é uma operação segura, seria também obrigado a testar o tipo com o instanceof:
public static void mostrarNome(Animal animal) {
if (animal instanceof Gato) {
System.out.println("O nome do gato é:" + a + " e ele faz " + ((Gato)a).ronronar());
else
System.out.println("O nome do animal é:" + a);
}
Afinal, não saberemos que o animal é um gato a menos que perguntemos explicitamente.