Java est un langage orienté objet. La différence entre l'approche orientée objet et celle procédurale est abordée dans la section suivante.
Java possède une indépendance plateforme et une portabilité.
- Java a une devise : « Écrivez une fois, exécutez partout ». Cette caractéristique permet aux programmes compilés d'être exécutés sur n'importe quellle plateforme disposant d'une machine virtuelle Java (JVM). Les fichiers .class générés après compilation peuvent être exécutés sur différentes plates-formes en les emballant dans un package JAR.
Java est robuste.
- Java est un langage fortement typé qui permet des vérifications au moment de la compilation pour détecter les problèmes de correspondance de types. Il exige une déclaration explicite des méthodes, ne supportant pas les déclaartions implicites comme en C. Ces exigences strictes assurent une fiabilité accrue du programme.
- La gestion des exceptions est un autre élément qui rend Java plus robuste. Les exceptions signalent des conditions anormales. L'utilisation des instructions try/catch/finally permet aux développeurs de localiser les traitements d'erreur, simplifiant ainsi la gestion des erreurs et la récupération.
Comment Java réalise-t-il la portabilité ?
Java utilise la Machine Virtuelle Java (JVM) pour assurer la portabilité.
La JVM peut être considérée comme un logiciel dont les versions varient selon les plates-formes. Le code Java écrit est compilé en fichiers .class (code intermédiaire). La JVM traduit ces fichiers en code machine spécifique à chaque plateforme. Les fichiers bytecode générés sont identiques sur toutes les plates-formes, mais les codes machine produits par la JVM diffèrent.
Ainsi, il suffit d'installer la JVM correspondante sur chaque plateforme pour exécuter les fichiers bytecode et exécuter le programme Java.
L'exécution d'un programme Java nécessite toujours la présence d'une JVM, car les résultats de la compilation ne sont pas directement des codes machine.
Différences entre Java et C++
- Java est un langage purement orienté objet, tous les objets héritent de java.lang.Object, tandis que C++ est compatible avec C et supporte à la fois l'approche orientée objet et procédurale.
- Java atteint la portabilité via la JVM, alors que C++ dépend de la plateforme spécifique.
- Java n'a pas de pointeurs, ses références sont considérées comme des pointeurs sécurisés, tandis que C++ dispose de pointeurs similaires à ceux de C.
- Java inclut un mécanisme de collecte de mémoire automatique, contrairement à C++ où la collecte manuelle est requise.
- Java ne supporte pas l'héritage multiple, seulement les interfaces, tandis que C++ autorise l'héritage multiple.
Relations entre JDK/JRE/JVM
JVM (Machine Virtuelle Java) est le cœur de la portabilité de Java. Tous les programmes Java sont compilés en fichiers .class qui s'exécutent sur la JVM. Les fichiers .class ne communiquent pas directement avec le système d'exploitation, mais via la JVM qui interprète les instructions.
Les implémentations JVM varient selon les systèmes d'exploitation, avec des versions Linux et Windows. Cependant, le bytecode généré reste identique, expliquant pourquoi Java permet l'exécution à distance.
JRE (Environnement d'exécution Java) est nécessaire pour exécuter les programmes Java. Il comprend la JVM et les bibliothèques de base Java.
JDK (Kit de développement Java) inclut JRE, des outils de développement (jinfo, jps, jstack), ainsi que des compilateurs et débogueurs.
Exécution compilée ou interprétée en Java ?
Java combine les deux approches : il compile en bytecode puis l'interprète via la JVM. Cela permet une exécution rapide tout en maintenant une bonne portabilité.
Différences entre programmation procédurale et orientée objet
La programmation procédurale se concentre sur les étapes résolvant un problème, tandis que la programmation orientée objet décompose le problème en objets.
Caractéristiques de la programmation orientée objet
Les quatre principes : encapsulation, héritage, polymorphisme, abstraction.
Principes fondamentaux de la programmation orientée objet
Six principes clés : responsabilité unique, remplacement de Liskov, principe de moindre connu, ouverture-close, dépendance inverse, isolement d'interface.
Est-ce qu'un tableau est un objet ?
Les tableaux Java héritent de la classe Object, ce qui les classe comme des objets.
Types de données primitifs en Java
| Type | Bits | Classe wrapper |
|---|---|---|
| boolean | 1 | Boolean |
| byte | 8 | Byte |
| char | 16 | Character |
| short | 16 | Short |
| int | 32 | Integer |
| long | 64 | Long |
| float | 32 | Float |
| double | 64 | Double |
Pourquoi éviter les types flottants pour les montants ?
Les nombres décimaux en machine sont des approximations, pas des valeurs exactes. Utilisez BigDecimal ou Long pour représenter les montants.
Passage par valeur vs passage par référence
Le passage par valeur affecte les types primitifs, tandis que le passage par référence modifie les objets.
Les classes wrappers en Java
Les classes wrappers permettent d'utiliser les types primitifs comme des objets, notamment pour les collections.
Autoboxing et unboxing
Exemple :
Integer x = 1; // Autoboxing
int y = x; // Unboxing
String : immuable
Les chaînes Java sont immuables pour garantir la sécurité, la compatibilité avec les hash maps et la gestion de la mémoire.
Changement de stockage String en JDK9
Le changement vers byte[] permet d'économiser de la mémoire pour les chaînes ASCII.
Différences entre String, StringBuffer et StringBuilder
String est immuable, tandis que StringBuffer et StringBuilder sont mutables. Le premier est thread-safe, le second non.
StringJoiner
Utilisé pour concaténer des éléments avec un séparateur.
List<string> elements = Arrays.asList("a", "b", "c");
StringJoiner sj = new StringJoiner(",", "[", "]");
for (String e : elements) {
sj.add(e);
}
System.out.println(sj.toString()); // [a,b,c]
</string>
Méthodes courantes de String
- indexOf()
- charAt()
- replace()
- trim()
- split()
- getBytes()
- length()
- toLowerCase()
- toUpperCase()
- substring()
- equals()
Combien d'objets crée new String("dabin") ?
Deux objets : un dans le pool de constantes et un dans la pile.
Pool de constantes String
Le pool de constantes stocke les littéraux de chaînes pour optimiser la mémoire.