(17 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | Embora fosse | + | 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 | + | 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 | + | 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 === | + | === Tipos primitivos e ''wrappers'' === |
− | Os tipos primitivos são os que figuram na seguinte tabela. | + | Os tipos primitivos e as classes que lhes correspondem são os que figuram na seguinte tabela. |
− | {| | + | {| style="border-style: solid; border-width: 2px; width: 90%;" cellspacing=3 |
− | | | + | ! bgcolor="#df8f2f" width="20%" | Tipo |
+ | ! bgcolor="#df8f2f" width="20%" | Dimensão (bits) | ||
+ | ! bgcolor="#df8f2f" width="20%" | Mínimo | ||
+ | ! bgcolor="#df8f2f" width="20%" | Máximo | ||
+ | ! bgcolor="#df8f2f" width="20%" | ''Wrapper'' | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | boolean | ||
+ | ! bgcolor="wheat" | - | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | - | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | - | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Boolean | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | char | ||
+ | ! bgcolor="wheat" | 16 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Unicode 0 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Unicode 2<sup>16</sup>-1 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Character | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | byte | ||
+ | ! bgcolor="wheat" | 8 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | -128 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | +127 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Byte | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | short | ||
+ | ! bgcolor="wheat" | 16 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | -2<sup>15</sup> | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | +2<sup>15</sup>-1 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Short | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | int | ||
+ | ! bgcolor="wheat" | 32 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | -2<sup>31</sup> | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | +2<sup>31</sup>-1 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Integer | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | long | ||
+ | ! bgcolor="wheat" | 64 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | -2<sup>63</sup> | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | +2<sup>63</sup>-1 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Long | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | float | ||
+ | ! bgcolor="wheat" | 32 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | [[wikipedia:IEEE floating-point standard|IEEE 754]] [http://www.l2f.inesc-id.pt/~david/ist/docencia/IEEE%20standard%20for%20binary%20floating-point%20arithmetic%20(IEEE%20754).pdf] | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | [[wikipedia:IEEE floating-point standard|IEEE 754]] | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Float | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | double | ||
+ | ! bgcolor="wheat" | 64 | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | [[wikipedia:IEEE floating-point standard|IEEE 754]] | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | [[wikipedia:IEEE floating-point standard|IEEE 754]] | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Double | ||
+ | |- | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | void | ||
+ | ! bgcolor="wheat" | - | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | - | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | - | ||
+ | ! style="padding-left: 10px;" bgcolor="wheat" align="left" | Void | ||
|} | |} | ||
− | + | O [[wikipedia:IEEE floating-point standard|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 : "=="; <font color="red">// false!</font> | ||
+ | } | ||
+ | } | ||
+ | </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: | ||
+ | * [http://docs.oracle.com/javase/7/docs/ Java Platform Standard Edition 7 Documentation] | ||
+ | * [http://docs.oracle.com/javase/7/docs/api/ Java Platform, Standard Edition 7 API Specification] | ||
− | [[category: | + | [[category:Ensino]] |
+ | [[category:PO]] | ||
+ | [[category:PO Exemplos]] | ||
[[category:Java]] | [[category:Java]] |
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").
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.
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).
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: