boolean
,
byte
,
short
,
char
,
int
,
long
,
float
et
double
, sont donc associées des classes
Boolean
,
Byte
,
Short
,
Character
,
Integer
,
Long
,
Float
et
Double
.
Ces classes sont construites sur le même modèle. Elles ont toutes un constructeur qui correspond au type de base qu’elle représente. Par exemple, pour la classe
Integer
:
Number
, qui propose des méthodes
byteValue()
,
shortValue()
,
intValue()
,
longValue()
,
floatValue()
et
doubleValue()
. Ces méthodes permettent de convertir la valeur numérique portée par l’objet en un type de base explicite.
Enfin, ces classes possèdent une méthode statique,
parse[TypeDeBase](String s)
, qui permet de décoder la chaîne de caractères passée en argument. Par exemple, si l’on veut lire un nombre flottant en double précision dans une chaîne de caractères, il suffit d’écrire les lignes suivantes.
Exemple 76. Conversion d'une chaîne de caractères en nombre
String s = "1.2563556e-3" ;
double d = Double.parseDouble(s) ;
Double dObjet = Double.valueOf(s) ;
NumberFormatException
.
Les classes
wrapper
possèdent une méthode
toString()
prenant en paramètre le type wrappé, par exemple
Integer.toString(int)
. Cette méthode statique permet de convertir un nombre en chaîne de caractères de façon très efficace. Une façon communément utilisée pour faire cette conversion est d'écrire :
Exemple 78. Conversion d'un nombre en chaîne de caractères - 2
int i = 12345 ;
String s = Integer.toString(i) ;
String
, les classes enveloppes sont finales : elles ne peuvent pas être étendues. De plus, la valeur portée par un objet
wrapper
ne peut pas être modifiée une fois l'objet construit. Ce sont donc des objets immutables.
Ce point est très important, car il permet de conserver la cohérence du passage de paramètre par valeur. Observons le cas suivant.
Exemple 79. Importance de l'immutabilité des classes wrapper
public class Main { public static void incremente(int i) { i++ ; } public static void main(String[] args) { int i = 1 ; incremente(i) ; System.out.println("i = " + i) ; } }
> i = 1Effectivement, la méthode
incrémente(int)
ne possède que la valeur du paramètre. Modifier cette valeur n'a donc pas d'influence sur celle possédée par la méthode
main()
.
Imaginons que l'on réécrive cet exemple simple avec des
Integer
au lieu d'
int
. S'il était possible de changer la valeur numérique portée par l'objet de type
Integer
, alors il serait possible à la méthode
incremente(Integer)
d'effectivement incrémenter l'objet passé en paramètre. La classe
Integer
étant immutable, ce n'est pas le cas, et le contrat du passage par valeur est toujours respecté.
Exemple 80. Auto-boxing et auto-unboxing
Integer i = new Integer(1) ; // instanciation classique d'un Integer Integer j = 1 ; // conversion automatatique -> boxing int k = i ; // conversion automatique -> unboxing
null
, alors l'infâme
NullPointerException
sera jetée.
String
StringBuffer
et
StringBuilder