GARANTIR DESCONTO

Fórum O que é Casting #565468

26/10/2011

0

Ola pessoal estou estudando java pelo livro Caleum que encontrei na net e chegou em uma parte que esplicava sobre casting gostaria de saber todas as formas de utilizar este artificiu com todos os tipos de variaveis
David Toreli

David Toreli

Responder

Post mais votado

26/10/2011

[quote="David Toreli"]Ola pessoal estou estudando java pelo livro Caleum que encontrei na net e chegou em uma parte que esplicava sobre casting gostaria de saber todas as formas de utilizar este artificiu com todos os tipos de variaveis
Todas as formas de utilizar cast? Na verdade só existe uma:
TipoEspecifico variavelEspecifica= (TipoEspecifico) variavelGenerica;
Para entender como funciona o casting, é necessario entender como funciona herança e polimorfismo. Suponha que voce tem a seguinte hierarquia de classes:
    A
    |
 +--+--+
 |     |
B_1   B_2
 |     |
C_1   C_2
 |
D_1
Perceba que na estrutura acima, Temos a classe "A" que é o topo da hierarquia; Temos as classes "B_1" e "B_2" que extendem a classe "A"; Temos a classe que extende "C_1" que extende a classe "B_1"; Temos a classe que extende "C_2" que extende a classe "B_2"; Temos a classe que extende "D_1" que extende a classe "C_1"; Pela hirarquia sabemos que: Todo objeto do tipo "B_1" ou "B_2", é também um objeto do tipo "A"; Todo objeto do tipo "C_1" é também um objeto do tipo "B_1" e por consequencia do tipo "A"; Todo objeto do tipo "C_2" é também um objeto do tipo "B_2" e por consequencia do tipo "A"; Todo objeto do tipo "D_1" é também um objeto do tipo "C_1" e por consequencia do "B_1" tipo "A"; Então podemos fazer o seguinte:
// declarar e inicializar uma variavel de cada tipo
A   a  = new A();
B_1 b1 = new B_1();
B_2 b2 = new B_2();
C_1 c1 = new C_1();
C_2 c2 = new C_2();
D_1 d1 = new D_1();
Agora que temos os objetos "a", "b1", "b2", "c1", "c2" e "d1", vamos fazer o seguinte:
// criar variaveis do tipo A e referenciar objetos ja existentes
A a1 = a;  // perfeitamente valido, afinal o objeto "a" é do tipo A, então pode ser referenciado pela a variavel "a2"
A a2 = b1; // também é valido pois todo objeto do tipo B_1, é uma extensão do tipo A
A a3 = b2; // idem
A a4 = c1; // idem
A a5 = c2; // idem
A a6 = d1; // idem
Da mesma forma podemos fazer o seguinte:
// criar variaveis do tipo B_1 e referenciar objetos ja existentes
B_1 b3 = b1; // perfeitamente valido, afinal o objeto "b1" é do tipo B_1, então pode ser referenciado pela a variavel "b3"
B_1 b4 = c1; // todo objeto do tipo "C_1" é também um objeto do tipo "B_1"
B_1 b5 = d1; // idem
Continuando:
// criar variavel do tipo C_1 e referenciar objeto ja existente
C_1 c2 = c1; // perfeitamente valido, afinal o objeto "c1" é do tipo C_1, então pode ser referenciado pela a variavel "c2"
Até aí ja deu pra entender que podemos declarar variaveis de um tipo de dado mais generico e fazer essas variaveis referenciarem objetos de tipos de dado mais especificos. Mas existem situações onte temos variaveis [b]declaradas[/b] com um tipo de dado generico e [b]inicializadas[/b] com um tipo de dado especifico. Exemplo:
// declarar uma variavel do tipo mais generico: o tipo A
A variavelGenerica;
// inicializar essa variavel com o tipo C_1
variavelGenerica= new C_1();
Ai em algum outro trecho de codigo pode ser necessario utilizarmos algum metodo que so exista no tipo de dado especifico, mas como nossa variavel é de um tipo de dado mais generico, nao temos acesso a tal metodo, nestas ocasioes utiliza-se o [i]cast[/i] Exemplo: Vamos supor que a classe C_1 tenha um metodo "fazAlgo" que nao exista na classe A e nos queremos invocar esse metodo:
// declarar uma variavel do tipo mais generico: o tipo A
A variavelGenerica;
// inicializar essa variavel com o tipo C_1
variavelGenerica= new C_1();

// invocar o metodo "fazAlgo"
variavelGenerica.fazAlgo();    // vai dar erro de compilação, pois a variavel é do tipo A e na classe A nao existe o metodo "fazAlgo"
Então fazemos o seguinte
// declarar uma variavel do tipo mais generico: o tipo A
A variavelGenerica;
// inicializar essa variavel com o tipo C_1
variavelGenerica= new C_1();

// declarar uma variavel especifica
C_1 variavelC1;

// inicializar a variavel especifica com o objeto do tipo generico
variavelC1 = variavelGenerica;    // Opa, continua dando erro de compilação, afinal, o compilador nao tem como adivinhar que a variavel do tipo A tem uma referencia ao tipo C_1
Solução: cast
// declarar uma variavel do tipo mais generico: o tipo A
A variavelGenerica;
// inicializar essa variavel com o tipo C_1
variavelGenerica= new C_1();

// declarar uma variavel especifica
C_1 variavelC1;

// inicializar a variavel especifica com o objeto do tipo generico
/*
 * O cast, nada mais é, do que colocar entre parenteses o tipo de dado especifico
 * que sabemos que esta sendo referenciado pela variavel de tipo generico
 */
variavelC1 = (C_1) variavelGenerica;    // Agora sim, estamos dizendo pro compilador que a variavel do tipo A tem uma referencia a um objeto do tipo C_1

// finalmente podemos invocar o metodo especifico da classe C_1
variavelC1.fazAlgo();
Perceba que o [i]cast[/i] so pode ser realizado seguindo a estrutura vertical da arvore hierarquica. Ou seja: podemos fazer cast de A para B_1, B_2, C_1, C_2 e D_1 podemos fazer cast de B_1 para C_1 e D_1 podemos fazer cast de B_2 para C_2 [b]não[/b] podemos fazer cast de B_1 pra B_2 e C_2 [b]não[/b] podemos fazer cast de B_2 pra B_1, C_1 e D_1 [b]não[/b] podemos fazer cast de C_1 pra C_2 [b]não[/b] podemos fazer cast de C_2 pra C_1 e D_1 Espero ter ajudado.

David Toreli

David Toreli
Responder

Gostei + 3

Mais Posts

26/10/2011

Douglas Eric

por acaso você comprou o tal livro? copiar livros da internet é crime.
Responder

Gostei + 0

26/10/2011

David Toreli

[quote="sekkuar"]por acaso você comprou o tal livro? copiar livros da internet é crime.
ei kara não sei se foi crime pois baixei deste forum aqui chamado eba se foi peço desculpa mais sinceramente não sabia disso mais respondam a minha pergunta por favor da uma forcinha ai site onde foi baixado o livro http://www.ebah.com.br/content/ABAAAAMqAAB/java-oo
Responder

Gostei + 0

26/10/2011

David Toreli

eu conheço mais uma, apesar de parecida: cast de primitivos! Alguns exemplos:
        float f = 1.23f;
        double d = 4.56;
        long l = 34;
        int i;
        char ch;
        
        f = (float) d;
        l = (long) d;
        l = (long) f;
        i = (int) d;
        i = (int) f;
        i = (int) l;
        ch = (char) i;
___________________________________________ A JLS (Java Language Specification) menciona várias "Casting Conversion": 5.5 [url="http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5"][u]Casting Conversion[/u][/url] [[]]
Responder

Gostei + 0

29/10/2011

João Sewaybrick

Além dos castings feito pelo colega acima. há caso em que esse cast (conversão) é feito de forma automática. Isso ocorre sempre do menor valor para o maior. quanto mair o tipo primitivo , menor a chance do cast automático. Seria como despejar um balde de água em um copo, haveria um derramamento. (por isso da necessidade do programador fazer o cast, seria como se ele disse-se que está ciente desse derramamento para o compilador, que irá parar de chiar); conversões implicitas: byte ->short->int->long->float->double explicitas double ->float->long ->int->short ->byte char pode ser convertido em um int, long, float ou double também tem as classes wrappers que são empacotadores dos tipos primitivos. Que também utilizam conversão
Responder

Gostei + 0

30/10/2011

Douglas Eric

[quote="DragonForce6544"]Além dos castings feito pelo colega acima. há caso em que esse cast (conversão) é feito de forma automática. Isso ocorre sempre do menor valor para o maior. quanto mair o tipo primitivo , menor a chance do cast automático. Seria como despejar um balde de água em um copo, haveria um derramamento. (por isso da necessidade do programador fazer o cast, seria como se ele disse-se que está ciente desse derramamento para o compilador, que irá parar de chiar); conversões implicitas: byte ->short->int->long->float->double explicitas double ->float->long ->int->short ->byte char pode ser convertido em um int, long, float ou double também tem as classes wrappers que são empacotadores dos tipos primitivos. Que também utilizam conversão
Isso não pode ser considerado um cast... pode? cast é justamente você forçar o valor a ser do tipo mais/menos específico
Responder

Gostei + 0

30/10/2011

Douglas Eric

[quote="simu"] ... A JLS (Java Language Specification) menciona várias "Casting Conversion": 5.5 [url="http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5"][u]Casting Conversion[/u][/url]
Responder

Gostei + 0

31/10/2011

Ricardo Staroski

[quote="sekkuar"]cast é justamente você forçar o valor a ser do tipo mais/menos específico
Complementando. [b]up cast:[/b] variavel de tipo menos especifico recebe valor/referencia da variavel de tipo mais especifico. [i]É realizado implicitamente, ou seja, não precisa colocar o tipo menos especifico entre parenteses[/i] [b]down cast:[/b] variavel de tipo mais especifico recebe valor/referencia da variavel de tipo menos especifico. [i]Precisa ser realizado explicitamente, ou seja, precisa colocar o tipo menos especifico entre parenteses[/i] Lembrando que com o down cast de objetos, não se perde nada pois a variavel sempre recebe uma referencia. Agora com o down cast de tipos primitivos, quando a variavel mais especifica contiver um valor maior que a magnitude da variavel menos especifica, esse valor será truncado.
Responder

Gostei + 0

31/10/2011

Douglas Eric

Conversão...
Responder

Gostei + 0

02/11/2011

João Sewaybrick

Como citado também por outros colegas, pode sim. cast implicito. A idéia de colocar o cast() forçado é simplesmente avisar que vc esta ciente que haverá um derramamento, ou seja esta ciente que vai perder dados. Uma coisa interessante a ser citado é o fato de haver derramamento mesmo quando vc tem certeza que um determinado número cabe em outro tipo. ex: digamos que temos 1 inteiro e atribuimos esse 1 a um byte , haverá derramamento. Mesmo o byte podendo ter um número entre -128 a 127? Sim, porque um int usa 4byte ou seja 00000000.00000000.00000000.00000001 e mesmo que esse número represente 1 quando vc converte para byte estará perdendo 3 octetos e para o compilador isso seria um derramamento.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar