Une valeur, c'est le résultat de l'évaluation d'une expression. Cette notion, essentielle au style applicatif, est également centrale en programmation objet, pour la simple raison que ce sont les valeurs qui circulent, et non les données : ce sont les valeurs qui sont affectées à une variable, passées en argument à une méthode, ou retournées comme résultat d'une méthode. Les valeurs se répartissent en deux catégories :
Les valeurs primitives, c'est-à-dire dont le type est primitif, bénéficient d'une notation littérale (par exemple, 34, true, 2.5). Contrairement aux objets, les valeurs ne sont pas créées. Il n'y a pas de valeur de type void.
Une variable est un emplacement mémoire pouvant contenir une valeur. Il en existe plusieurs catégories :
Les deux opérations que l'on peut faire sur une variable sont : la lecture de sa valeur, et l'écriture d'une valeur. L'écriture remplace une valeur précédemment écrite, ou bien initialise la variable, c'est-à-dire lui donne une valeur initiale. Évaluer une variable consiste à lire sa valeur. C'est une erreur de lire la valeur d'une variable sans qu'elle ait été préalablement écrite ; cette erreur est détectée par le compilateur qui émet un message << Variable may not have been initialized >>. Les variables locales ne bénéficient pas d'une initialisation automatique, contrairement aux autres catégories de variables.
Java dispose d'un grand nombre de catégories d'expression, qui sont toutes construites à partir de noms (de type, de membre, de variable), de constantes littérales et d'opérateurs. Citons :
Chaque catégorie d'expression a ses propres règles d'évaluation. Notons que l'évaluation d'une expression de type void ne produit pas de valeur ; l'évaluation d'une expression de type t différent de void produit une valeur de type t ou d'un sous-type de t. Cette propriété, dite de sûreté de typage est un facteur essentiel de sécurité.
Évaluer une affectation de la forme var = exp consiste à évaluer l'expression exp, ce qui produit une valeur, puis à écrire cette valeur dans la variable var. L'expression var = exp n'est correctement typée que si le type de exp est égal au type de var ou en est un sous-type ; la propriété de sûreté de typage garantit alors que la valeur affectée à var est du même type que var ou en est un sous-type.
Les noms de variable ne sont pas les seules expressions qui peuvent figurer à gauche d'une affectation : une expression d'accès à un élément d'un tableau (exemple : t[i+1]) ou à un champ d'une instance (exemple : p.x) sont également permises. Ces expressions sont qualifiées en anglais informatique de lvalue, ce qu'on pourrait traduire par expression gauche. Par contre, une expression comme a+1 n'est pas une expression gauche et ne peut être affectée.
Les expressions arithmétiques et booléennes de Java, qui sont très voisines de celles que l'on trouve dans d'autres langages, sont reléguées en Annexe. Par contre, les expressions de création d'objet et celles d'invocation de méthode, propres à la programmation à objets, seront examinées en détail (notamment au § 1.9).
Si t est un type et E une expression, l'expression (t)E est appelée expression de transtypage (en anglais, cast). Elle n'est généralement définie que si t est un sur-type (transtypage ascendant) ou un sous-type (transtypage descendant) du type de E. Quand elle est définie, l'expression (t)E est de type t. Par exemple, pour effectuer une opération flottante quand les opérandes sont entiers, il faut d'abord appliquer un transtypage en double à l'un des opérandes : (double)5/2 et 5/(double)2 ont ainsi pour valeur 2.5 et (double)5 a pour valeur le flottant 5.0. Il existe des transtypages entre tous les types numériques. Pour ces types, l'évaluation d'une expression de transtypage réalise une conversion de la valeur. Les conversions descendantes, par exemple de int vers byte, ou de double vers int, peuvent conduire à une perte d'information par troncature. Les conversions entre float et int peuvent induire un perte d'information, bien que ces deux types aient la même taille.