Qual é a diferença entre up-casting e down-casting com relação à variável de classe?
Por exemplo, no programa a seguir, a classe Animal contém apenas um método, mas a classe Dog contém dois métodos; depois, como convertemos a variável Dog na variável Animal.
Se a conversão for feita, como podemos chamar o outro método de Dog com a variável Animal.
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
Dog
é umAnimal
. Na maioria das vezes, o upcasting é desnecessário, a menos que você queira usar um determinado método sobrecarregado.callme
existe em ambosAnimal
eDog
.callme2
só existe emDog
que você jogaa
paraDog
torná-lo trabalho.Respostas:
Upcasting está transmitindo para um supertipo, enquanto downcasting está transmitindo para um subtipo. Upcasting é sempre permitido, mas o downcasting envolve uma verificação de tipo e pode gerar a
ClassCastException
.No seu caso, um elenco de um
Dog
para umAnimal
é um upcast, porque umDog
é umAnimal
. Em geral, você pode fazer upcast sempre que houver um relacionamento entre duas classes.Downcasting seria algo como isto:
Basicamente, o que você está fazendo é dizer ao compilador que você sabe qual é realmente o tipo de tempo de execução do objeto . O compilador permitirá a conversão, mas ainda inserirá uma verificação de integridade de tempo de execução para garantir que a conversão faça sentido. Neste caso, o elenco é possível porque em tempo de execução
animal
é na verdade umDog
mesmo que o tipo estáticoanimal
éAnimal
.No entanto, se você fizer isso:
Você receberia um
ClassCastException
. A razão é porqueanimal
o tipo de tempo de execução éAnimal
, e então, quando você instrui o tempo de execução para executar o elenco, ele vê queanimal
não é realmente umDog
e, portanto, gera umClassCastException
.Para chamar o método de uma superclasse, você pode fazer
super.method()
ou executando o upcast.Para chamar o método de uma subclasse, você deve fazer um downcast. Como mostrado acima, você normalmente corre o risco
ClassCastException
de fazer isso; no entanto, você pode usar oinstanceof
operador para verificar o tipo de tempo de execução do objeto antes de executar a conversão, o que permite evitarClassCastException
s:fonte
ClassCastException
ou não? Como no primeiro caso?Down-casting e up-casting foram os seguintes:
Upcasting : Quando queremos converter uma subclasse para Superclasse, usamos Upcasting (ou ampliação). Isso acontece automaticamente, sem necessidade de fazer nada explicitamente.
Downcasting : Quando queremos converter uma Superclasse para Subclasse, usamos Downcasting (ou restrição), e o Downcasting não é diretamente possível em Java, explicitamente precisamos fazer isso.
fonte
Upcasting e downcasting são parte importante do Java, que nos permite criar programas complicados usando sintaxe simples e nos oferece grandes vantagens, como polimorfismo ou agrupamento de objetos diferentes. Java permite que um objeto de um tipo de subclasse seja tratado como um objeto de qualquer tipo de superclasse. Isso é chamado upcasting. O upcasting é feito automaticamente, enquanto o downcasting deve ser feito manualmente pelo programador , e eu darei o meu melhor para explicar por que é isso.
Upcasting e downcasting NÃO são como converter primitivas de uma para outra, e acredito que é isso que causa muita confusão, quando o programador começa a aprender a moldar objetos.
Polimorfismo: Todos os métodos em java são virtuais por padrão. Isso significa que qualquer método pode ser substituído quando usado em herança, a menos que esse método seja declarado como final ou estático .
Você pode ver o exemplo abaixo como
getType();
funciona de acordo com o tipo de objeto (Cão, Animal de estimação, Cão policial).Suponha que você tem três cães
Dog - Esta é a super classe.
Pet Dog - Pet Dog estende Dog.
Cão de Polícia - Cão de Polícia estende Dog Pet.
Polimorfismo: Todos os métodos em java são virtuais por padrão. Isso significa que qualquer método pode ser substituído quando usado em herança, a menos que esse método seja declarado como final ou estático (a explicação pertence ao conceito de tabelas virtuais)
Impressões
Normal Dog
Impressões
Pet Dog
Impressões
Police Dog
O downcasting precisa ser feito manualmente pelo programador
Quando você tenta invocar o
secretID();
método noobj3
qual éPoliceDog object
referenciado, masDog
que é uma superclasse na hierarquia, gera erro, poisobj3
não tem acesso aosecretId()
método. Para invocar esse método, você precisa fazer o downcast desse obj3 manualmente paraPoliceDog
que imprime
ID
No caminho semelhante ao invocar o
dogName();
método naPetDog
classe que você precisa para downcastobj2
paraPetDog
desde obj2 é referenciado paraDog
e não têm acesso aodogName();
métodoPor que é assim, que o upcasting é automático, mas o downcasting deve ser manual? Bem, veja bem, o upcasting nunca pode falhar. Mas se você tem um grupo de cães diferentes e quer downcast los todos para um de seus tipos, então há uma chance de que alguns destes cães são realmente de diferentes tipos ou seja,
PetDog
,PoliceDog
, e processo falhar, atirandoClassCastException
.Esse é o motivo pelo qual você precisa fazer o downcast de seus objetos manualmente, se você os referenciou ao tipo de superclasse.
fonte
Eu sei que esta pergunta foi feita há muito tempo, mas para os novos usuários desta pergunta. Leia este artigo onde contém uma descrição completa sobre upcasting, downcasting e uso da instância do operador
Não há necessidade de upcast manualmente, isso acontece por si só:
Mammal m = (Mammal)new Cat();
igual aMammal m = new Cat();
Mas o downcasting sempre deve ser feito manualmente:
Por que é assim, que o upcasting é automático, mas o downcasting deve ser manual? Bem, veja bem, o upcasting nunca pode falhar. Mas se você tem um grupo de animais diferentes e deseja baixá-los todos para um gato, há uma chance de que alguns desses animais sejam realmente cães, e o processo falha, lançando ClassCastException. É aqui que deve ser introduzido um recurso útil chamado "instanceof" , que testa se um objeto é instância de alguma classe.
Para mais informações, leia este artigo.
fonte
Melhor tentar esse método para upcasting, é fácil entender:
fonte
Talvez esta tabela ajude. Chamando o
callme()
método de classeParent
ou classeChild
. Como princípio:fonte
1.- Upcasting.
Ao fazer uma upcasting, você define uma tag de algum tipo, que aponta para um objeto de um subtipo (Tipo e subtipo podem ser chamados de classe e subclasse, se você se sentir mais confortável ...).
O que significa que essa tag, animalCat, terá apenas a funcionalidade (os métodos) do tipo Animal, porque a declaramos como tipo Animal, não como Cat.
Estamos autorizados a fazer isso de maneira "natural / implícita / automática", em tempo de compilação ou em tempo de execução, principalmente porque o Cat herda algumas de suas funcionalidades do Animal; por exemplo, mova (). (Pelo menos, gato é um animal, não é?)
2.- Downcasting.
Mas, o que aconteceria se precisássemos obter a funcionalidade do Cat, do nosso tipo de tag Animal ?.
Como criamos a tag animalCat apontando para um objeto Cat, precisamos de uma maneira de chamar os métodos de objeto Cat, de nossa tag animalCat de uma maneira bem inteligente.
Esse procedimento é o que chamamos de Downcasting, e podemos fazê-lo apenas no tempo de execução.
Hora de algum código:
fonte
Pai: Carro
Filho: Figo
Carro c1 = novo Figo ();
=====
Upcasting: -
Método: O objeto c1 se refere a Métodos de classe (Figo - O método deve ser substituído) porque a classe "Figo" é especificada com "novo".
Variável da Instância: O objeto c1 se refere à variável de instância da Classe de Declaração ("Carro").
Quando a classe Declaration é pai e o objeto é criado como filho, acontece a conversão implícita, que é "Upcasting".
======
Downcasting: -
Figo f1 = (Figo) c1; //
Método: O objeto f1 se refere ao Método da Classe (figo) quando o objeto inicial c1 é criado com a classe "Figo". mas uma vez feito o downcast, os métodos que estão presentes apenas na classe "Figo" também podem ser referidos pela variável f1.
Variável da Instância: O objeto f1 não se refere à variável de instância da classe Declaration do objeto c1 (a classe de declaração para c1 é CAR), mas com o downcast ele se refere às variáveis de instância da classe Figo.
======
Use: Quando Object é da classe Child e a classe de declaração é Parent e a classe Child deseja acessar a variável Instance de sua própria classe e não da classe pai, isso pode ser feito com "Downcasting".
fonte
upcasting significa converter o objeto em um supertipo, enquanto downcasting significa converter em um subtipo.
Em java, upcasting não é necessário, pois é feito automaticamente. E é geralmente chamado de elenco implícito. Você pode especificá-lo para deixar claro para outras pessoas.
Assim, escrevendo
ou
leva exatamente ao mesmo ponto e, em ambos os casos, será executado o
callme()
fromDog
.O downcasting é necessário porque você definiu
a
como objeto de Animal. Atualmente você sabe que éDog
, mas o java não tem garantias de que é. Na verdade, em tempo de execução, poderia ser diferente e o java lançaria umClassCastException
, isso aconteceria. Claro que não é o caso do seu exemplo de amostra. Se você não convertera
paraAnimal
, o java não poderá nem compilar o aplicativo porqueAnimal
não possui métodocallme2()
.No seu exemplo você não pode alcançar o código de
callme()
deAnimal
partirUseAnimlas
(porqueDog
substituí-lo) a menos que o método seria como segue:fonte
Podemos criar um objeto para Downcasting. Neste tipo também. : chamando os métodos da classe base
fonte