"Les cours de neeko.fr"

Retour en haut

Introduction à Java

Premiers contacts avec un langage de programmation.

Historique

Java à été conçu au début des années 1990, et la première version à été rendue publique en 1996.

L'idée de base était d'avoir un langage simple, puissant et surtout multiplateformes.

Il a prit son envol aux début d'internet grâce aux "Applet". Depuis, il à été dépassé dans ce domaine, mais est très présent sur les ordinateurs de bureau, côté serveur, et sur les terminaux mobiles.

Comparaison

Les langages de programmation permettent de simplifier et d'optimiser la communication entre un humain et une machine.

Il existe 3 grandes familles de langages de programmation :

Les langages compilés

Exemples : C, C++, ADA, Objective-C, ...

Le code source est compilé en un programme en langage machine par un compilateur.

Le compilateur et le programme compilé sont dépendants de l'architecture et du système d'exploitation.

Une fois compilé, le programme peut être exécuté directement, sans avoir besoin du compilateur.

En général, ce sont les programmes les plus rapides, mais les plus complexes, du fait qu'ils sont de "bas-niveaux". Cela dit, des erreurs de conception peuvent les rendre difficilement lisibles, et finalement très peu performants.

Les langages interprétés

Exemples : PHP, Ruby, Javascript, Bash, ...

Le code source est interprété par un programme pour qu'il soit exécuté.

L'interpréteur est dépendant de l'architecture et du système d'exploitation.

Le code source doit être ré-interprété à chaque fois qu'il doit être exécuté.

En général, plus lent à s'exécuter que les langages compilés. Cela dit, ils sont souvent plus simples. Avec l'évolution des performances du matériel, ce sont souvent d'excellents choix pour des entreprises qui n'ont pas un besoin critiques de performances.

Les machines virtuelles

Exemples : Java, Groovy, JRuby, ...

Le code source est compilé en un programme intermédiaire appelé le "bytecode".

Ce "bytecode" est alors interprété par la machine virtuelle, afin que le programme s'éxecute.

Le "bytecode" est dépendant de la machine virtuelle, mais pas de l'architecture réelle.

La machine virtuelle, par contre, est un programme compilé dépendant de l'architecture et du système d'exploitation.

C'est donc un mélange des 2 techniques précédentes, l'interprétation d'un programme intermédiaire étant nettement plus rapide que du code source sans intermédiaire.

C'est un excellent compromis entre les performances et la simplicité.

La machine virtuelle de JAVA : la JVM

Java, grâce à sa machine virtuelle, peut être utilisé dans un grand nombre de contextes (téléphone, serveur, desktop, ...).

En réalité, il y a plusieurs variantes de machine virtuelles, qui permettent de profiter des spécificités de chaque environnements.

Un programme Java est basé sur des éléments de "Java SE", et éventuellement d'une autre variante, "Android" par exemple.

Seuls les éléments standard de "Java SE" seront portables entre plusieurs variantes (ce qui est assez logique, puisque par exemple, un serveur n'a pas d'écran tactile).

Les bases de JAVA

Pour commencer avec JAVA, il installer le JRE (le "runtime environement", contenant notamment la machine virtuelle) et le JDK (le "developement kit", contenant le compilateur, et autres outils de développeurs).

Ces éléments se trouvent sur le site d'Oracle, l'éditeur de JAVA. Attention, il faut prendre la version 6, qui se trouve un peu plus bas sur la page (et pas la 7, pour des raisons de compatibilité) : http://www.oracle.com/technetwork/java/javase/downloads/index.html

Pour travailler efficacement, il faut installer un outil comme Eclipse, mais il n'est pas nécessaire pour l'introduction : http://www.eclipse.org/downloads/packages/eclipse-classic-421/junosr1

Le traditionnel "Hello World"

Evitez de copier-coller le code, mais tapez le dans un fichier.

Cela évite les problèmes de caractères spéciaux des traitements de texte, et en plus cela permet de mieux mémoriser.

Tapez dans un simple fichier texte appelé HelloWorld.java (attention aux majuscules) :

/* Mon premier programme Java */ class HelloWorld { public static void main (String[] args){ System.out.println("Bonjour le monde !"); } }

...ensuite compilez ...

javac HelloWorld.java

...puis executez ...

java HelloWorld

...et enfin admirez !

Bonjour le monde !

Explications

On commence par un commentaire pour indiquer quelques informations utiles au développeur. Le compilateur et le JVM ignore simplement ces éléments.

/* Mon premier programme Java */

Cette première ligne de code est une déclaration de classe. A noter que le nom de cette classe correspond précisément au nom du fichier, sans l'extension.

Tout ce qui suit l'accolade ouvrante, jusqu'à l'accolade fermante, fait parti de la classe "HelloWorld".

class HelloWorld {

Dans la déclaration de la classe, on déclare la fonction principale, qui sera automatiquement exécutée par la JVM. C'est le point de départ de notre programme, elle est indispensable.

public static void main (String[] args){

Tout le code présent dans la fonction "main" sera executé. Ici, on affiche du texte à l'écran.

System.out.println("Bonjour le monde !");

La première accolade fermante clôture la fonction "main", et l'autre la classe "HelloWorld" .

} }

Pour résumer :

Le code source d'un programme JAVA est constitué de fichiers "*.java" contenant des classes.

Il ne peut y avoir qu'une classe par fichier, et le nom de chaque classe doit correspondre précisément au nom du fichier, sans extension.

Une fois compilé avec le programme javac, chaque fichier source "*.java" est transformé en programme intermédiaire "*.class", qui peut être exécuté sur la JVM, s'il contient une fonction spéciale "main".

Pour nos exemples, nos programmes ne sont composés que d'une classe, mais dans la réalité, ils en comporteront plusieurs dizaines, voir des centaines. Par contre, notre programme ne contiendra toujours qu'une seule fonction "main".

Utilisation des variables

Exemple : Calcul de l'age

Fichier HelloWorldAge.java

/* Affiche le nombre de fois que la personne à passé de jour de l'an */ class HelloWorldAge { public static void main (String[] args){ //definition de variables chaines de caracteres String nom = "Nicolas"; //definition de variables INT int anneeActuelle = 2013; int anneeNaissance = 1981; //calcul de l'age int age = anneeActuelle - anneeNaissance; //affichage du resultat System.out.println("Bonjour, " + nom); System.out.println("C'est votre " + age + "eme jour de l'an."); } }

Exemple : Récupération des paramètres et convertion La machine virtuelle fournit les paramètres passés au programmes automatiquement. Elle initialise un tableau de "String", contenant les chaines de caractères passées lors de l'appel du programme avec "java". Il faudra convertir les chaines en chiffre au besoin. Fichier "HelloWorldAgeParam.java"

/* Affiche le nombre de fois que la personne à passé de jour de l'an, selon le nom et l'annee de naissance passe en parametre */ class HelloWorldAgeParam { public static void main (String[] args){ //args[0] et + correspondent aux parametres passes. String nom = args[0]; //definition de variables entieres int anneeActuelle = 2013; //Integer.parseInt permet de transformer une chaine en INT int anneeNaissance = Integer.parseInt(args[1]); //calcul de l'age int age = anneeActuelle - anneeNaissance; //affichage du resultat System.out.println("Bonjour, " + nom); System.out.println("C'est votre " + age + "eme jour de l'an."); } }

Gestion d'erreurs et conditions Java est un langage fortement typé (contrairement à PHP, par exemple), ce qui signifie que toute variable doit être initialisée correctement avant d'être utilisée. De nombreuses erreurs sont détectées au moment de la compilation, mais d'autres, comme la longueur des tableaux ne peuvent l'être qu'au moment de l'exécution. Nous devons donc prévoir ce cas. Nous pouvons aussi utiliser des conditions pour gérer des comportements différents comportements de notre application. Fichier "HelloWorldAgeParamSecure.java"

/* Affiche le nombre de fois que la personne à passé de jour de l'an, selon le nom et l'annee de naissance passe en parametre */ class HelloWorldAgeParamSecure { public static void main (String[] args){ if (args.length < 2) { System.out.println("Merci de préciser votre nom et votre année de naissance."); return; } String nom = args[0]; int anneeActuelle = 2013; int anneeNaissance = Integer.parseInt(args[1]); //calcul de l'age int age = anneeActuelle - anneeNaissance; //affichage du resultat System.out.println("Bonjour, " + nom); System.out.println("C'est votre " + age + "eme jour de l'an."); } }

Boucles Fichier "HelloWorldAgeBoucle.java"

/* Affiche toutes les annees entre l'annee en cours et l'annee de naissance */ class HelloWorldAgeBoucle { public static void main (String[] args){ //definition de variables entieres int anneeActuelle = 2013; int anneeNaissance = 1981; //affichage du resultat System.out.println("Bonjour, voici vos années depuis la naissance:"); for (int i=anneeNaissance; i<=anneeActuelle; i++) { System.out.println("Année " + i + " "); } System.out.println(""); System.out.println("...et dans l'autre sens :"); for (int i=anneeActuelle; i>=anneeNaissance; i--) { System.out.println("Année " + i + " "); } System.out.println(""); } }

Exercices

Programme VerifMajorite - Ecrire un programme qui, à partir de l'age d'une personne définie dans une variable, affiche si cette personne est majeure en France (à partir de 18 ans). - Modifier ce programme pour gérer la majorité en France et au Japon (à partir de 20 ans). - Modifier ce programme pour récupérer l'age de la personne en paramètre, et afficher le message "Vous devez fournir un age en paramètre" si l'utilisateur ne fourni pas d'age. - Modifier ce programme pour qu'il récupère le pays en paramètre, en plus de l'age. Pour aller plus loin - Il est possible de mutualiser certaines lignes de code sous forme de fonctions. Dans l'exercice, quelle partie pourrait être mutualiser sous forme de fonction ? - Lorsque l'on récupère des paramètres sous forme de texte et qu'on les transforme en "entier" par exemple, il y a une erreur si la conversion est impossible. Il faut utiliser des "Exceptions" pour gérer cela. - Dans un programme complexe, les éléments sont découpés sous forme de classes pour simplifier la maintenance. La difficulté est de bien répartir les responsabilités des classes, et de les faires communiquer entres elles.