Java não pode ser considerado uma linguagem totalmente orientada a objetos por conta dos tipos primitivos. Os tipos primitivos não são instancias de nenhuma classe, são apenas valores específicos. A partir do Java 5, foi introduzido então classes wrappers que representam os tipos primitivos. As Classes wrappers os "empacotam" - fenômeno também conhecido como boxing.
Tipo Primitivo | Classe Wrapper | Super Classe | |
---|---|---|---|
Lógico |
boolean
|
Boolean
|
Object
|
Caractere |
char
|
Character
|
|
Inteiro |
byte
|
Byte
|
Number
|
short
|
Short
|
||
int
|
Integer
|
||
long
|
Long
|
||
Ponto Flutuante |
float
|
Float
|
|
double
|
Double
|
Antigamente, era possível usar os construtores dos wrappers pra instanciar os tipos primitivos distintos.
// Wrappers
Short num7 = new Short((short) 1);
Byte num8 = new Byte((byte) 10);
Integer num9 = new Integer(100);
Long num10 = new Long(1000L);
Float num11 = new Float(3.5f);
Double num12 = new Double(3.5555);
Boolean flag2 = new Boolean(true);
Character b = new Character('b');
Entrentanto, desde a versão 9 do Java que essa maneira foi depreciada.1 De acordo com a documentação da Oracle, raramente o uso é apropriado e portanto é uma escolha melhor usar os método estático <Wrapper>.valueOf()
2
// o tipo de num vai ser int (primitivo)
var num = Integer.parseInt("254");
// o tipo de numInt vai ser Integer (Wrapper)
var numInt = Integer.valueOf("9121")
Uma funcionalidade muito útil que o compilador Java fornece é a conversão automática entre os tipos primitivos e os wrappers correspondentes.
// Autoboxing
// O primitivo é automaticamente convertido na classe Long
Long numW = 1000L;
// Unboxing
// A classe Long é automaticamente convertida no tipo primitivo
long numP = numW;