Introdução aos Objectos/Tipos primitivos em Java
From Wiki**3
Embora fosse concebível definir classes para todos os tipos de dados a utilizar por um programa em Java, inclusivamente para os tipos básicos, tal conduziria a ineficiência durante a execução.
Para obviar ao problema, no Java utiliza-se um sistema de tipos híbrido: são definidos tipos básicos para cobrir entidades atómicas. Estes tipos semelhantes aos do C e do C++ (embora com algumas restrições, como, por exemplo, as dimensões) permitem tratar eficientemente entidades como inteiros ou caracteres.
No entanto, para permitir alguma uniformidade no tratamento dos tipos, a linguagem também define as classes correspondentes aos tipos primitivos e, a partir da versão 1.5, permite a auto-conversão de tipos primitivos para essas classes. As classes correspondentes aos tipos primitivos são designadas wrappers ("envoltórios") e o processo de conversão implícita é designado por autoboxing ("auto-empacotamento").
Tipos primitivos e wrappers
Os tipos primitivos e as classes que lhes correspondem são os que figuram na seguinte tabela.
| Tipo | Dimensão (bits) | Mínimo | Máximo | Wrapper |
|---|---|---|---|---|
| boolean | - | - | - | Boolean |
| char | 16 | Unicode 0 | Unicode 216-1 | Character |
| byte | 8 | -128 | +127 | Byte |
| short | 16 | -215 | +215-1 | Short |
| int | 32 | -231 | +231-1 | Integer |
| long | 64 | -263 | +263-1 | Long |
| float | 32 | IEEE 754 [1] | IEEE 754 | Float |
| double | 64 | IEEE 754 | IEEE 754 | Double |
| void | - | - | - | Void |
O IEEE 754 é a norma de representação de números em vírgula flutuante mais utilizada. Além dos números de vírgula flutuante, esta norma define formatos de representação para valores especiais (infinitos e outros), assim como as operações possíveis sobre esses valores.
Aviso!
Note-se que apesar de os wrappers fornecerem uma visão com objectos e classes sobre os tipos primitivos, nem sempre o comportamento é o mesmo. Este aspecto é particularmente importante quando se consideram os operadores.
Considere-se o seguinte exemplo (com tipos primitivos): <java5>
class AutoboxingTest {
public static void main(String args[]) {
float i = 2.4f;
float j = 2.4f;
assert i >= j : ">="; // ok
assert i <= j : "<="; // ok
assert i == j : "=="; // ok
}
}
</java5>
Este programa não produz resultados visíveis. Considere-se agora o mesmo exemplo, mas empregando os wrappers: <java5>
class AutoboxingTest {
public static void main(String args[]) {
Float i = 2.4f;
Float j = 2.4f;
assert i >= j : ">="; // ok
assert i <= j : "<="; // ok
assert i == j : "=="; // false!
}
}
</java5>
O resultado é uma excepção:
Exception in thread "main" java.lang.AssertionError: ==
at AutoboxingTest.main(AutoboxingTest.java:9)
Estes problemas ocorrem especialmente em relação aos operadores (alguns operam sobre as referências e não sobre os objectos).
Ver Também
Além dos tipos primitivos definidos pela linguagem e dos tipos que podem ser definidos pelo programador, a linguagem providencia uma biblioteca rica de conceitos para suporte à programação. Alguns destes conceitos são importantes para o próprio funcionamento da linguagem.
Documentação oficial pode ser encontrada a partir destas duas páginas: