domingo, 11 de maio de 2014

Tipos de dados primitivos e de referência

Tipos de dados primitivos e de referência

Antes de explicarmos os tipos de dados do Java, é necessário entender o conceito de variável.
Variáveis são locais onde são armazenados valores na memória do computador. Toda variável é identificada por um nome, e possui um tipo de dado, que define os tipos de valores que podem ser armazenados ali.

Na linguagem Java somos obrigados a declarar o tipo de variável que estamos criando antes de podermos usá-la, por exemplo:

int matricula;
matricula = 1;

Também podemos atribuir um valor a ela no mesmo momento da criação, conforme abaixo:

int matricula = 1;

Porém se não especificarmos o tipo de dado, o Java não aceitará, por exemplo:

matricula = 1;
        //ERRADO

Os dados podem ser de dois tipos diferentes: Tipos de dados Primitivos e de Referência.


Tipo de dados primitivos:

Declarado a variável como um tipo de dado primitivo, não será possível colocar outro tipo de dado lá dentro. No exemplo citado acima, estamos criando a variável matricula como int (inteiro). Não será possível atribuir um valor string como por exemplo: matricula= "Abacaxi", porém podemos atribuir outro valor inteiro, como matricula = 44; . Neste caso o valor da variável matricula deixa de ser 1 e passa a ser 44.

A linguagem Java suporta 8 tipos de dados primitivos:

boolean: 
Pode assumir apenas 2 valores, false ou true.

char: 
Pode assumir apenas um caractere Unicode de 16 bits. Para entender a conversão de hecimal/hexadecimal/octal para Unicode podemos utilizar a tabela abaixo:




byte:
Pode assumir valores numéricos inteiros de -128 até 127. Requer 8 bits para ser implementado.

short: 
Pode assumir valores numéricos inteiros de -32.768 até 32-767. Requer 16 bits para ser implementado.

int:
Pode assumir valores numéricos inteiros de -2.147.483.648 até 2.147.483.647. Requer 32 bits para ser implementado.

long:
Pode assumir valores numéricos inteiros de -9.223.372.036.854.775.808 até 9.223.372.036.854.775.807. Requer 64 bits para ser implementado.

float:
Pode assumir valores numéricos reais de -3.402823e38 até 3.402823e38. Possui precisão simples (até 7 digitos) e requer 32 bits IEEE 754 para ser implementado.

double:
Pode assumir valores numéricos reais de -1.79769313486232e308 até 1.79769313486232e308. Possui precisão dupla (até 15 dígitos) e requer 64 bits IEEE 754 para ser implementado.

Por padrão, as variáveis do tipo char, byte, short, int, long, float e double são inicializadas com valor 0. Já o boolean é inicializado com valor "false".

Cabe ao programador entender o melhor tipo de dado para utilizar em cada variável do seu programa. 

As variáveis de tipos de dados primitivos não podem referenciar objetos ou invocar métodos.


Tipos de dados de referência:


Tipos de dados por referência são compostos por arrays, Strings e qualquer outro tipo de classe instanciável.
Os dados por referência são utilizados para armazenar as localizações dos objetos da memória do computador. Dentro desses objetos podem existir variáveis de instância e métodos. 

Quando um objeto é atribuído para uma variável, aquela variável está na verdade associada a uma referência do objeto, e não ao objeto em si. Essa referência é o endereço de memória em que aquele objeto está localizado.

Por exemplo, temos a seguinte classe:

class Cliente {
String nome;
int matricula;
}

Para declarar uma variável utilizando um tipo de referência, basta colocar o nome da classe como o tipo de dado:

Cliente a;

Nesse exemplo, estamos criando uma variável (a), que pode referenciar objetos criados da classe Cliente.

Se quisermos criar uma nova instância de um objeto de uma classe, podemos utilizar o "new", por exemplo:

Cliente a = new Cliente();


Falando em tipos de dados de referência, é importante citar um outro exemplo: O array.

Arrays são objetos que possuem valores chamados "elementos". O array permite armazenar valores de um mesmo tipo em alocações de memória contínuas. Os elementos de um array são identificados por um índice de números inteiros, que começa do 0 e vai até n-1, onde n é o número de elementos disponíveis no array. 
Todos os elementos do array devem conter o mesmo tipo de dado, por exemplo: Um array "int" deve conter apenas valores do tipo "int". 

O array é considerado um tipo de dado de referência pois ele é uma classe do java (está contido em java.lang.Object). 

Sintaxe para declaração de array:

TipoDeDado [] nome = new TipoDeDado[TamanhoDoArray];

ou:

TipoDeData [] nome = {elemento1, elemento2... elemento n};

Por exemplo:

int [] idade = new int [10];

Neste exemplo criamos um array chamado idade, que está declarado como tipo de dados "int". O índice do array começa em idade[0] e acaba em idade[9]. Cada posição do índice pode conter um valor diferente. 

String [] nomes = {"Maria","Joao","Leonardo"};

Neste exemplo criamos um array chamado nomes, declarado como tipo de dados "String". O tamanho do array criado é de acordo com o número de elementos declarados no momento da criação. No caso, esse array possui 3 elementos. 



Referência:


Segundo os autores Jonathan Knudsen e Patrick Niemeyer, "O sistema de tipos de uma linguagem de programação descreve como seus elementos de dados (variáveis e constantes) estão associados com armazenamento em memória e como são relacionados uns aos outros[...] Tipos primitivos em java são usados e passados "por valor". Em outras palavras, quando um valor primitivo como um int é designado para uma variável ou passado como um argumento para um método, ele é simplemente copiad. Já os tipos de referência, são sempre acessados "por referência". A referencia é simplemente um nome ou endereço de um objeto. O que uma variável de referência mantem é um "ponteiro" para um objeto de seu tupo (ou subtipo). Quando a referência é designada ou passada para um método, apenas a referência é copiada, não o objeto que está sendo apontado."
Veja também: http://www.devmedia.com.br/tipos-de-dados-por-valor-e-por-referencia-em-java/25293


Vídeo explicativo:

Veja também: https://www.youtube.com/watch?v=NbfDPxY55vQ


Exemplo utilizando os conceitos aprendidos:

Será desenvolvido um sistema para controle de passageiros num avião. Deverão ser guardados os dados do protocolo de voo de cada passageiro (até 7 digitos numéricos), do peso da mala de cada passageiro, a quantidade de passageiros no total do avião e se o passageiro fez check-in ou não. Quais seriam os melhores tipos de dados a serem utilizados para cada variável?

Resposta: 

Protocolo de voo - int. int é a melhor escolha pois poderá assumir qualquer combinação de números de até 7 dígitos.

Peso da mala - float. Como o peso da mala pode ser um valor quebrado, pode-se utilizar o float para uma melhor precisão, porém não é necessária tanta precisão a ponto de necessitarmos do double.

Quantidade de passageiros - short. Um avião não terá mais de 32 mil passageiros, portanto o short é mais do que suficiente para expressar a quantidade de passageiros.

Check-in - boolean. Necessitamos apenas da informação se o passageiro fez o check-in ou não. Nesse caso, o melhor tipo de dado é o boolean.




Exercícios:


1 - Qual a vantagem de utilizar short ou int ao invés de utilizar sempre long para expressar números inteiros?

2 - Será criado um sistema para controle de pessoas numa festa. Crie uma classe com as variáveis e tipos de dados que assumir corretos. Ao final, explique o motivo de cada tipo de dado utilizado.



Bibliografia:


Learning Java, 3rd edition. May 2005 - Jonathan Knudsen, Patrick Niemeyer 
http://www.asciitable.com/index/asciifull.gif
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://www.dummies.com/how-to/content/reference-types-in-java.html
http://www.roseindia.net/java/master-java/java-data-types.shtml
http://www.roseindia.net/java/master-java/Reference-Data-Types.shtml
http://www.ic.unicamp.br/~islene/mc102/aula03/aula03.pdf
http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html


Alunos:

Thainá de Cassia Barros Rodrigues - RM 71288
Jhenifer Coelho - RM 72392

Rafael Nascimento Ruban dos Santos - RM 71184

Victor - RM

Um comentário:

  1. Muito bom... apenas citem abaixo da primeira imagem, o local de onde pegaram a imagem, ok?

    abçs

    ResponderExcluir