Difference between revisions of "Introdução aos Objectos/Tipos primitivos em Java"

From Wiki**3

< Introdução aos Objectos
 
 
(18 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
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.
  
[[category:OOP]]
+
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.
 +
 
 +
{| 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:Ensino]]
 +
[[category:PO]]
 +
[[category:PO Exemplos]]
 
[[category:Java]]
 
[[category:Java]]

Latest revision as of 22:45, 17 October 2015

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: