Programmation Java/Machine virtuelle
Introduction à la machine virtuelle Java.
Le langage Java utilise une notion extrêmement importante en informatique : la notion de machine virtuelle. Cette machine virtuelle est composée de trois parties, et est souvent fournie avec l'OS, ou facilement installable comme un logiciel normal.
Sur les ordinateurs, la même machine virtuelle est capable de lancer :
Environnement d'exécution.
Le langage Java est un langage orienté objet qui doit être compilé. Cependant, le compilateur Java ne produit pas directement un fichier exécutable, mais du code intermédiaire sous la forme d'un ou plusieurs fichiers dont l'extension est codice_1 ; ce code intermédiaire est appelé bytecode. Pour exécuter le programme, il faut utiliser la machine virtuelle Java qui va interpréter le code intermédiaire en vue de l'exécution du programme.
Il ne s'agit pas d'une compilation normale, car le compilateur ne produit pas du code compréhensible directement par le microprocesseur, ni d'un langage interprété, car il y a tout de même la notion de compilation, mais une situation intermédiaire entre un langage interprété et un langage complètement compilé.
En d'autres termes, un programme Java, une fois compilé en code intermédiaire, n'est compréhensible que par la machine virtuelle, qui va traduire à la volée (interprétation) les instructions exécutées en code compréhensible par la machine physique.
Depuis Java SE 1.3, les machines virtuelles d'Oracle contiennent un interpréteur capable d'optimiser le code appelé HotSpot.
L'interpréteur effectue plusieurs tâches :
Outre un interpréteur, l'environnement d'exécution fournit également :
Chargeur de classe.
Le chargeur de classe charge les classes nécessaires à l'exécution, alloue l'espace mémoire nécessaire et établit les liens entre elles "(linkage)". Le chargeur de classe connait la structure d'un fichier codice_1.
Gestionnaire de mémoire.
Le gestionnaire mémoire assure les services liés à la mémoire, en particulier :
Avantage de l'utilisation de la machine virtuelle.
L'utilisation d'une machine virtuelle a l'énorme avantage de garantir une vraie portabilité. Il existe des machines virtuelles Java pour de très nombreux environnements : Windows, MacOS, Linux et autres. 
Ces machines virtuelles sont capables d'exécuter exactement le même code intermédiaire (les mêmes fichiers Java en "bytecode") avec une totale compatibilité. C'est là une situation unique et assez remarquable qui a fait le succès de ce langage.
La machine virtuelle Java n'est pas uniquement développée sur des ordinateurs classiques, une multitude d'appareils disposent d'une machine virtuelle Java : téléphones portables, assistants personnels (PDA)…
Les interfaces de programmation (API) Java : des fonctionnalités énormes.
La machine virtuelle Java possède un ensemble de bibliothèques extrêmement complètes : des bibliothèques graphiques, des bibliothèques systèmes, etc.
Toutes ces bibliothèques sont totalement portables d'un environnement à un autre.
La machine virtuelle Java offre donc un véritable système d'exploitation virtuel, qui fonctionne au-dessus du système d'exploitation, de la machine cible et le masque totalement aux applications.
La lenteur de Java.
Le gros point faible du concept de machine virtuelle est que le code intermédiaire "(bytecode)" est interprété par la machine virtuelle. Ceci entraîne une baisse importante des performances des programmes. 
Toutefois, avec les machines virtuelles actuelles, cet argument n'a plus autant de poids. La technique appelée « compilation juste à temps » (JIT : "Just-In-Time") est employée par la machine virtuelle quand une méthode est appelée. Cette technique consiste à compiler à la volée la méthode appelée (la première fois) en code natif directement exécutable par le processeur.
Toute méthode s'exécute ainsi aussi rapidement que du code natif.
Autres langages.
D'autres langages de programmation permettent de produire du bytecode Java exécutable avec la JVM :
Plus de détails : Développer en Java/Langages dérivés
Processeur Java.
Un processeur Java est l'implémentation matérielle d'une machine virtuelle Java.
C'est à dire que les "bytecodes" constituent son jeu d'instruction.
Actuellement, il y a quelques processeurs Java disponibles :

Programmation Java/Opérateurs
Les opérateurs.
Le tableau ci-dessous présente la liste des opérateurs utilisables en Java, avec leur signification et leur associativité, dans l'ordre de leur évaluation (du premier au dernier évalué) et le type de données auquel chaque opérateur s'applique.
Les opérateurs regroupés entre deux lignes épaisses ont la même priorité.
Chaque case de la colonne « associativité » regroupe les opérateurs de même priorité.
Expressions.
codice_1 et codice_2.
Java effectue une conversion en valeur de type codice_3 de manière implicite sur les valeurs de type codice_1 et codice_2 dès qu'une opération est effectuée, ce qui peut donner des résultats non conforme à ce que l'on pourrait attendre (détails).
Expressions booléennes.
Les expressions booléennes employant les opérateurs ET logique (codice_6) et OU logique (codice_7) sont évaluées de manière paresseuse.
C'est à dire que l'évaluation s'arrête aussitôt que le résultat est déterminé.
Exemple avec l'opérateur ET logique (vrai si les deux opérandes sont vrais), si le premier opérande est faux le résultat est faux et le deuxième opérande n'est pas évalué. Si le deuxième opérande est le résultat de l'appel à une méthode, cette méthode ne sera pas appelée :
String s = getText();
if ((s!=null) && (s.length()>0))
// si s vaut null, la longueur n'est pas testée car cela provoquerait une exception.
Parfois ce comportement n'est pas désirable. Dans ces cas-là, il faut utiliser les opérateurs binaires équivalents ET (codice_8) et OU (codice_9).
Le remplacement dans l'exemple précédent serait cependant une erreur :
String s = getText();
if ((s!=null) & (s.length()>0))
// si s vaut null, la longueur est tout de même testée et provoque donc une exception !
Savoir si une racine carrée est entière.
La fonction calculant les racines carrées pouvant trouver des nombres à virgules, voici une courte technique pour savoir s'il s'agit d'un entier :
public boolean testRacineEntiere(int n)
 int r = (int)Math.sqrt(n);
 return (r*r == n);