quarta-feira, 2 de setembro de 2009

Tipos de Dados em java

Pontos importantes:
1 -Tipos da dados em java são divididos em
2 grandes Categorias:
Tipos Primitivos
Tipos Referência(Falaremos no Proximo Post)

2 - Todos os tipos primitivos são considerados Valores Literais

3 - Todos os tipos primitivos armazenam os Bits realmente dos valores

4 - Todos as representações de tipos primitivos são palavras com letras minúsculas pois, todos são Keywords

5 - O operador - = (igual) - em java significa RECEBE.
int x = 0;
O inteiro x RECEBE 0(zero)



LEMBRE DOQUE VIMOS ANTERIORMENTE?

SIGUA ISSO QUE você se dará bem:




Esse tipo, será mostrado um deles aqui, que é o tipo PRIMITIVO


Isso é Simplesmente uma passagem de valores, oque estiver a direita do Operador(= igual) é atribuido ao que estiver a esquerda do Operador(= igual):








Tipos Primitivos:
(Os valores são armazenados em Bits), como o exemplo acima:
10 Em Decimal = 0000 0000 0000 0000 0000 0000 0000 1010 em Binário



Temos 4 categorias de dados em Tipos Primitivos:
*** Todas as 4 categorias são considerados valores literais, pois armazenam o real valor em bits.

- Tipo Inteiro= byte,short, int,long
- Tipo Ponto-Flutuante = float e double
- Tipo Textual = char
- Tipo Logico = boolean


Inteiro:
Armazenam valores inteiros. Podem ser representados em formatos:
decimais,octais ou hexadecimais:

2 -> Decimal
075 -> o 0 - zero - a esquerda indica que é Octal
0xBA -> o 0x -zero x - a esquerda indica que é Hexadecimal


Tamanho

Nome ou Tipo

Range

8 bits

byte

- 2 ^ 7 ate 2 ^ 7 -1

16 bits

short

- 2 ^ 15 ate 2 ^ 15 -1

32 bits

int

- 2 ^ 31 ate 2 ^ 31 -1

64 bits

long

- 2 ^ 63 ate 2 ^ 63 -1



*byte e short forão inventados para preservação de memoria.



Quando eu for usar long:

Quando você especificar um valor e quer que seja long, use a letra L do lado direito do valor, int é default ou seja se não especificar o compilador irá intender como inteiro. O "l" pode ser maiusculo ou minusculo.

long meuvalor = 20; -> ocorreu Promoção de int para long
long meuValor = 20L; -> colocamos um long em uma variavel do tipo long
long meuValor = 20l; -> colocamos um long em uma variavel do tipo long




Pontos Flutuantes:
Um valor é considerado Ponto Fluantes quando tem a letra(e ou E), ou tiver a letra(f ou F) ou a letra(d ou D):

e ou E = expoente
f ou F = float
d ou D = double

Ou quando são usados para armazenar valores decimais.O Default é double, Sempre use ponto(.), É padrão nos USA usar ponto.

Exemplos:

10.0 - Um valor de ponto Flutuante, double
10.0D - Um valor de ponto Flutuante, double
2.999F - Um valor de ponto Flutuante, float
6.0E25 - Um valor de ponto Flutuante, double = 60000000000000000000000000.0
6.0E25 - É igual a 6.0E+25



Tamanho

Nome ou Tipo

Range

32 bits

float

-11.40129846432481707e-45 ate 3.40282346638528860e+38

64 bits

double

4.94065645841246544e-324d ate
1.79769313486231570e+308d



Quando eu for declarar um float:
Sempre coloque o F do lado direito do valor para espeficar que é um float senão não compila.(F maiusculo ou minusculo da na mesma).
Porque do f?
float é menor que double logo, um float cabe em um float porem um Double não cabe em um float. É a mesma coisa que cast

float variable = 0.0F;
float variable = (float) 0.0; -> mesma coisa





Textual:
É usado para armazenar um simples caracter inclusive caracteres Unicode não assinados. Todos tem 16 bits(sem Sinal).

Para usar char oque eu preciso?
Especificar o seu caracter dentro de ''

Um char não armazena a real caracter, mais sim os bits representantes dela.

char cacaracter = 't';

Exemplos:

'\t' - Tabulação



Logico:
São aceitos somente valores booleanos(true ou false), um dos dois.

boolean meuValor = true;


Um Exemplo prático:

public class MinhaClasse{ //Esse é um comentario ignorado pelo compilador



public static void main(String[] array){
int x = 20;


}//fim do metodo main

}


Se você mandar executar isso oque acontece?
1 - Seu programa vira processo
2 - O class Loader da JVM carregará sua classe
3 - Todo processo tem uma thread, toda thread tem uma STACK, Toda Stack tem:
- Operand Stack
- Local Variable
- Uma Referência para Constant POOL
A jvm jogará o 20 na Operand Stack
4 - Esse 20 será armazenado nas Local Variable Referente ao método main(Uma coisa que quero deixar claro é que, em Stack damos o Nome de Frame ao métodos quando estão sendo usados.)
5 - Não tem mais codigo no code_block do método main, a JVM termina seu processo.

Usando: javap -c Temos em bytecode:


Compiled from "MinhaClasse.java"
public class MinhaClasse extends java.lang.Object{
public MinhaClasse();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return

public static void main(java.lang.String[]);
Code:
0: bipush 20
2: istore_1
3: return

}


Agora vamos desenhar:








Você empurrou o numero 20 que é do tipo inteiro(ou seja 32 bits), e mandou armazenar em (int x - que é do tipo inteiro, ou seja 32 bits)... 32 bits cabem em 32 bits? SIM! então você obteve:



Ou isso se fica mais facil:







Porque se eu fizer int x = 32L; da ERRO?
1 - um int tem 32 bits
2 - 32L é um long, long tem 64 bits

Olha oque você fez:



Mesmo que fosse:
int x = 0.0F;
Não daria certo, int tem 32 bits, float tem 32 bits. SO que Pontos Flutuantes trabalham diferente de Integrais, eles usam na verdade mais de um Slot em memoria, mais por representação não fica viavel fazer.





É hora da revisão:

- Cuidados com a representação dos formatos dos valores dos TIPOS INTEGRAIS, podem ser em 3 tipos:
2 -> Decimal
075 -> o 0 - zero - a esquerda indica que é Octal
0xBA -> o 0x -zero x - a esquerda indica que é Hexadecimal



- Promoção:

long meuvalor = 20; -> ocorreu Promoção de int para long
long meuValor = 20L; -> colocamos um long em uma variavel do tipo long
long meuValor = 20l; -> colocamos um long em uma variavel do tipo long


- Um valor é considerado Ponto Fluantes quando tem a letra(e ou E), ou tiver a letra(f ou F) ou a letra(d ou D),ou quando são usados para armazenar valores decimais.O Default é double, Sempre use ponto(.), É padrão nos USA usar ponto.

- Sempre que quiser representar um valor do tipo Ponto flutuante float, use o (F ou f), para haver cast, ja que double é default.


- Um char aparentemente apresenta um caracter porem ele é uma representação em bits de um caracter

- Tipos booleanos só aceitam dois tipos de valores, OU true OU false.

- Em Valores do tipo Inteiro, o padrão é int

- Em Valores do tipo Ponto Flutuante, o padrão em double

- O operador igual(=) Significa em java recebe,
int a = 8;
O Inteiro a RECEBE 8





Curiosidades:

------->Porque o byte tem o valor elevado a 7 e não a 8?
Leva-se em conta que 1 byte são 8 bits, Porem o range de valores de byte é de - 2 ^ 7 a 2 ^ 7 -1, porque disso?

Porque elevado a 7 e não a 8?
1 Bit é usado para guardar o sinal(+ ou -), se um Byte tem 8 Bits, e 1 Bit é usado para guardar sinal(+ ou -) só resta 7 Bits para representar um número.

Decimal Binário
125 1111101(7 Bits)

Porem para representar em java isso é precisa do Bit de sinal:
01111101 - 8 Bits = +125
11111101 - 8 Bits = -125


Vamos a outro exemplo:

Decimal Binário
128 10000000(8 Bits)

Porem para representar em java isso é precisa do Bit de sinal:
010000000 - 9 Bits = +128
110000000 - 9 Bits = -128

PERCEBA QUE 9 BITS JA NÃO FAZ PARTE DO RANGE DE BYTE, portanto esse numero não pode ser um BYTE.


Porque -1 do range?
Pois o 0 é incluso no range.
O Byte tem um range de -2 ^ 7 a 2 ^ 7 -1 significa:
- 125, -124, -123, -122.... - 2,- 1, 0, +1,+2...+125


------->Be Careful!!! Bears Shouldn't Ingest Large Fury Dogs.
Source: Head First katty Siera

Be = boolean
Careful = char
Bears = byte
Shouldn't = short
Ingest = int
Large = long
Fury = float
Dogs = double

------->Quer ver como char armazena realmente Bits e usa como conversão para letras?
char x = 100;

Se você mandar imprimir na saida Padrão sairá: d


-------> O tipo char é inteiro literal, outro exemplo disso?

int x = 'c';

Se você mandar imprimir na saida Padrão sairá: 99

Nenhum comentário:

Postar um comentário