[OCPJP6] 021 – Atribuições

Cast de tipos primitivos

No post anterior vimos um exemplo de cast com tipo primitivo, vamos complementar o assunto. Veja algumas regras abaixo:

  • Toda soma de número inteiros resulta em int (como vimos no post anterior)
  • Todo número inteiro é implicitamente int. Tome cuidado com o tamanho, talvez seja necessário converter para um tipo maior – por exemplo long
  • Todo número flutuante é implicitamente um double
  • Não precisa de cast quando ocorre ampliação
  • É necessário cast quando houver perda de precisão

Exemplos

Cast para um tipo menor que float (float > int)

float f1 = 128.987f;
int i1 = (int) f1; // PERDA DE PRECISAO
// s1 = 128

Cast para um tipo menor que float (float > short)

float f1 = 128.987f;
short s1 = (short) f1; // PERDA DE PRECISAO
// s1 = 128

Cast para um tipo menor que float (float > byte)

float f1 = 128.987f;
byte b1 = (byte) f1;
// E agora? 128?

Um ponto de atenção no exemplo acima, byte vai de -128 até 127! Qual seria o resultado?

-128 será a resposta, porque a JVM irá remover os primeiros (esquerda) 24 bits, dando o resultado -128.

// Compare os resultados
Integer.toBinaryString((byte)128);
Integer.toBinaryString(-128);

Cast para um tipo maior que float (float > double)

float f1 = 128.545f;
// 32 bits cabe dentro de 64 (cast implicito)
double d1 = f1;
// d1 = 128.98699...
}

Adicional (pegadinhas de cast)

byte b1 = 128; // NÃO COMPILA, certo?

byte b2 = 3;
b2 += 7; // COMPILA :O

byte b3 = 3;
b3 = b3 + 7; // NÃO COMPILA (ahhhh)
b3 = (byte) (b3 + 7); // AGORA COMPILA

No exemplo acima b2 += inclui o cast implicito =D

Comentem, estendam o assunto… Compartilhem =)

[OCPJP6] 017 – Orientação a objetos

Cast

Significa conversão. Mais especificamente em Java, conversão de variável. O cast pode ocorrer em variáveis de objetos e primitivos, para este capítulo vamos ver apenas o cast em objetos. Dividido em downcast e upcast.

downcast

Em downcast a conversão da variável de referência é para baixo na herança, ou seja o cast da variável de referência pode ser declarada apenas para classes específicas, caso contrário não irá compilar. Uma das exceções mais conhecidas ClassCastException (indica que a conversão em tempo de execução está errada) pode acontecer no downcast. Vamos ver alguns exemplos:

package certificacao;
public class Homem { public void correr(){} }
public class Menino extends Homem { public void brincar(){} }

No exemplo abaixo irá ocorrer um ClassCastException em tempo de execução, porque a instância da variável de referência “homem” é Homem e não Menino. O compilador aceita o cast (downcast) porque Menino é um Homem, mas em execução “homem” não é um Menino e então ocorre o erro.

// ...
Homem homem = new Homem();
Menino menino = (Menino) homem;

No próximo exemplo ocorrerá um erro de compilação porque não existe uma herança (generalização -> especialização).

// ...
Animal animal = new Animal();
Menino menino = (Menino) animal;

upcast

Bem mais simples, o upcast é o contrário do downcast e acontece implicitamente. Vamos ver alguns exemplos:

// ...
Menino menino = new Menino();
Homem homem = menino;

Acessando métodos

Os métodos visíveis das variáveis são referentes ao tipo. Masssss nada impede de acessar um método de uma especialização. Vamos ver alguns exemplos:

// ...
Menino menino = new Menino();
Homem homem = menino;
homem.correr(); // visível
homem.brincar(); // NAO COMPILA
((Menino)homem).brincar(); // AGORA SIM =D

Comentem, estendam o assunto… Compartilhem =)