Upcasting e dowcasting

Você está confundindo “variáveis” com “objetos”.

Isso é um erro muito grave. É que em C++ existem variáveis que são objetos e variáveis que são referências para objetos; mas em Java todas as variáveis só contém referências para objetos.

Se uma variável é do tipo “Pai”, isso quer dizer que ela pode conter uma referência a um objeto da classe “Pai”, ou então da classe “Filho”. OK?

Não nao pode fica susse, isso nao to confundindo, soh ali na hora de dar os nomes q boiei…

Mas entendi oq vc kiz dizer no final…vlwww…

mas e dai o filho tem acesso aos metodos dele e aos do neto, mas também herdou os metodos do pai.

Entao agora pergunto eu, qual a diferença do filho e do pai, se eles tem conhecimento dos mesmos metodos, levando em conta que o pai enxerga os metodos do filho.

flw e vlw por enquanto

[quote=fr4nc0w]mas e dai o filho tem acesso aos metodos dele e aos do neto, mas também herdou os metodos do pai.

Entao agora pergunto eu, qual a diferença do filho e do pai, se eles tem conhecimento dos mesmos metodos, levando em conta que o pai enxerga os metodos do filho.[/quote]

Objetos podem acessar métodos deles próprios, e aqueles que foram herdados de outros acima na cadeira de herança.

Um objeto mais genérico não pode acessar métodos de objetos mais especializados, ou seja, abaixo na cadeia de herança.

Então qual a diferença entre.

Pai obj1 = new Filho(); // Eu só criei um objeto do tipo Pai correto? mas o objeto ainda é filho.

e

Filho obj2 = new Filho(); // Objeto é do tipo filho.

Mas entre criar um objeto do tipo pai ou filho, isso implicará em quais diferenças?

Sei que não posso:

Filho obj1 = new Pai(); // Criar um objeto PAI com o tipo Filho. pois ele não pode usar Metodos do filho e mtu menos ele sabe q filho existe, é isso?

[quote=fr4nc0w]Então qual a diferença entre.

Pai obj1 = new Filho(); // Eu só criei um objeto do tipo Pai correto? mas o objeto ainda é filho.

e

Filho obj2 = new Filho(); // Objeto é do tipo filho.

Mas entre criar um objeto do tipo pai ou filho, isso implicará em quais diferenças?[/quote]

A diferença é que você não vai poder acessar as interfaces de métodos que só existem na classe Filho.

[code]Mamífero m = new Cachorro(); // todo cachorro é um mamífero

Cachorro c = new Cachorro(); // todo cachorro é um cachorro

Cachorro c = new Mamífero(); // Nem todo mamífero é um cachorro

[/code]

[quote=Bruno Laturner][quote=fr4nc0w]Então qual a diferença entre.

Pai obj1 = new Filho(); // Eu só criei um objeto do tipo Pai correto? mas o objeto ainda é filho.

e

Filho obj2 = new Filho(); // Objeto é do tipo filho.

Mas entre criar um objeto do tipo pai ou filho, isso implicará em quais diferenças?[/quote]

A diferença é que você não vai poder acessar as interfaces de métodos que só existem na classe Filho.
[/quote]

Se eu criar um objeto filho do tipo pai neh?

[quote=fr4nc0w][quote=Bruno Laturner][quote=fr4nc0w]Então qual a diferença entre.

Pai obj1 = new Filho(); // Eu só criei um objeto do tipo Pai correto? mas o objeto ainda é filho.

e

Filho obj2 = new Filho(); // Objeto é do tipo filho.

Mas entre criar um objeto do tipo pai ou filho, isso implicará em quais diferenças?[/quote]

A diferença é que você não vai poder acessar as interfaces de métodos que só existem na classe Filho.
[/quote]

Se eu criar um objeto filho do tipo pai neh?[/quote]

Filho do tipo Pai é muito confuso, vou usar exemplo do Mamífero e Cachorro:

Se você criar um objeto Cachorro e atribuí-lo à uma variável do tipo Mamífero, o mamífero não pode fazer coisas específicas de um cachorro.

Caso queira que um mamífero se comporte como um cachorro, há somente duas opções:

  1. Utilizar da coerção para Mamífero se tornar um Cachorro.

Mamifero m = new Cachorro(); Cachorro c = (Cachorro) m; // Você, como programador, está garantindo que este mamífero é um cachorro.
2) Cachorro sobrescrever comportamentos/métodos definidos em Mamífero

[code]public class Mamífero {

public void falar() {
System.out.println("…");
}
}[/code][code]public class Cachorro extends Mamífero {

public void falar() {
System.out.println(“Au au!”);
}
}[/code]Mamifero m = new Cachorro(); m.falar(); // imprime Au Au!

Note que falar não é um método específico de Cachorro, portanto não quebramos as regras.

E onde fica o Downcast e o Upcasting nos exemplos que voce me deu ali encima…

E onde fica o Downcast e o Upcasting nos exemplos que voce me deu ali encima…