Plan (hide)

  1.   1.  Généralité
  2.   2.  Concepts de base
  3.   3.  Cours
  4.   4.  Les TD/TP
    1.   4.1  Corrections
  5.   5.  Examens et autres désagréments
    1.   5.1  Travaux demandés
  6.   6.  Quelques références

important<< Vous avez un travail à rendre avant le jeudi 5 mars 2020 14h. Aucun travail en retard sera admis. Prenez donc vos précautions. Vous devez déposer votre archive sur la plate-forme Eureka dans le cours Java avancé. L'énoncé se trouve ici. Bon courage.

Travail par mail à rendre pour le 2 mai ! Travail à rendre pour le 30 mai !

   tip

Semaine du 19 mars et suivante : Réalisation d'un correcteur orthographique :

  1. Manipulation de chaines de caractères ;
  2. Utilisation de collection ;
  3. Lecture écriture de fichier.
  • Exercices sur les threads
   important

Partiel le mercredi 11 avril de 9h à 11h, salle B201.

  • Tout jusqu'aux références de méthodes incluses.

1.  Généralité

Oak ("Chêne") est le nom qui est donné à Java dans un premier temps. Mais comme celui-ci est déjà utilisé on lui donne le nom de Java en l'honneur du nom argotique (en américain de Nord) du breuvage le plus consommé par les programmeurs, c'est-à-dire le café, dont une partie de la production vient de l'île de Java

Java est une technologie composée d'un langage de programmation orienté objet et d'un environnement d'exécution. Préalablement nommé Oak, il a été créé par James Gosling et Patrick Naughton chez Sun Microsystems avec le soutien de Bill Joy.

Le langage Java fut officiellement présenté le 23 mai 1995 au SunWorld.

Le concept Java est basé sur le langage Java, la machine virtuelle Java et l'API Java (ces deux derniers composants forment l'environnement d'exécution, ou JRE, pour Java Runtime Environment).

2.  Concepts de base

La première caractéristique de Java est d'être orienté objet. Tout y est objet ou presque ... A la source de l'objet, la classe. La classe est le support de l'encapsulation : c'est un ensemble de données et de fonctions regroupées dans une même entité. Une classe est une description abstraite d'un objet. Les fonctions qui opèrent sur les données sont appelées des méthodes. Instancier une classe consiste à créer un objet sur son modèle. Pour accéder à une classe il faut en déclarer une instance de classe ou objet. Une classe comporte sa déclaration, des variables et la définition de ses méthodes. Une classe se compose en deux parties : un en tête et un corps. Le corps peut être divisé en 2 sections : la déclaration des données et des constantes on parle souvent d'attributs et la définition des méthodes. Les méthodes et les données sont pourvues de qualificatifs de visibilité qui gèrent leur accessibilité par les composants hors de la classe.

La deuxième caractéristique du langage, c'est la portabilité cela signifie que les programmes écrits en Java doivent fonctionner sur plusieurs types de matériel informatique. Un programmeur doit pouvoir écrire un programme une seule fois et, le faire fonctionner dans n'importe quel ordinateur. Ceci est permis en compilant le code source d'un programme Java dans un pseudo-code intermédiaire appelé bytecode Java. Le code est par la suite exécuté par une machine virtuelle la JVM, un programme écrit en code natif sur le matériel cible qui interprète le pseudo-code Java en code utilisable pour le matériel concerné. De plus, des bibliothèques sont offertes pour fournir l'accès à des fonctionnalités propres à la machine cible -- comme les graphiques ou le réseau -- d'une manière unifiée. Le langage Java offre aussi le support au parallélisme et à la distribution.

Java est un langage pour le Web. La plate-forme Java fut l'un des premiers systèmes à offrir le support de l'exécution du code à partir de sources distantes. Une applet peut fonctionner dans le navigateur Web d'un utilisateur, exécutant du code téléchargé d'un serveur HTTP. Le code fonctionne dans un espace très restrictif, ce qui protège l'utilisateur des codes erronés ou mal intentionnés.

 public class Complexe
 {
  private double re,im;
  public static final Complexe I = new Complexe(0,1);
  public Complexe(double reel, double imaginaire)
  {
  re = reel;
  im= imaginaire;
  }

  public double partieReelle()
  { return re;}

  public double partieImaginaire()
  { return im;}

  public double module()
  { return Math.sqrt(re*re + im*im);}

  public Complexe add(Complexe z)
  { return new Complexe(re+z.partieReelle(), 
  im + z.partieImaginaire());}

  public Complexe mul(Complexe z)
 {
  double zre = z.partieReelle();
  double zim = z.partieImaginaire();
  return new Complexe( re*zre - im*zim , 
  re*zim + im*zre);
 }

  public static Complexe add(Complexe z1, Complexe z2)
  {
  double z1re = z1.partieReelle();
  double z2re = z2.partieReelle();
  double z1im = z1.partieImaginaire();
  double z2im = z2.partieImaginaire();
  return new Complexe (z1re + z2re, z1im + z2im);
  }

  public static Complexe mul(Complexe z1, Complexe z2)
  {
  double z1re = z1.partieReelle();
  double z2re = z2.partieReelle();
  double z1im = z1.partieImaginaire();
  double z2im = z2.partieImaginaire();
  return new Complexe (z1re*z2re - z1im*z2im , 
  z1re*z2im + z1im*z2re);
  }
 } 

 public class UseComplexe
 {
  public static void main(String args[])
  {
  z1 = new Complexe (1,1);
  z2 = new Complexe (0,0);
  z3 = z1.add(z2);
  }
 }

3.  Cours

Ce cours fait suite à celui de l1 et du premier semestre de l2. Nous aborderons en particulier :

  • L'héritage ;
  • Le polymorphisme ;
  • La classe Object ;
  • Les exceptions en Java ;
  • Généricité de type, lambda, références de méthodes et streams ;
  • Les collections ;
  • Les Entrées/Sorties ;
  • Les threads ;
  • Java Fx, graphismes et fenêtrages (cette partie pourra ne pas être traitée) ;

Les transparents de cours sont ici. Les exemples ne sont pas toujours accessibles via le fichier pdf, voici une archive dans laquelle vous trouverez les fichiers sources. Attention, c'est éventuellement le bazar, ils ont été commentés en cours, ainsi certains sont mal écrits et/ou ne tiennent pas compte des nouvelles possibilités de Java. Vous avez également un complément sous la forme d'une présentation rapide concernant les threads, l'EDT et swing.

Java 5 a introduit la notion de généricité de type, cela est présenté sommairement dans les transparents. Vous trouverez une présentation plus complète sur le sujet, ici ainsi que sur les collections qui utilisent ce mécanisme, sans oublier un exercice. Depuis Java 1.8 les expressions lambdas, les références de méthodes et les streams sont largement utilisés. Un premier survol vous est proposé.

Depuis java 7. L'api NIO 2 remplace la classe File de la très ancienne api IO. Une série de diapositives présente cela. Un exemple/exercice est également proposé.

La notion de threads est également redéveloppée et complétée et vous trouverez un exercice ici, vous permettant de mettre en oeuvre les différents concepts.

La bibliothèque JavaFX remplace désormais officiellement Swing. Plutôt que mettre à jour mes transparents j'en ai fait une présentation séparée.

4.  Les TD/TP

Désarchiver les corrections

Enregistrer le fichier dans un répertoire donné en cliquant avec le bouton droit de la souris. "Enregistrer la cible sous" Dans votre répertoire tapez l'une des commande suivantes :

  • Un fichier fichier .tar : tar xvf fichier.tar
  • Un fichier fichier .tar.gz : tar zxvf fichier.tar.gz
  • Un fichier fichier .tar.bz2 : tar jxvf fichier.tar.bz2

Vous pouvez également utiliser ark.

Si vous avez un problème d'encodage :

 $ iconv --from-code=ISO-8859-15 --to-code=UTF-8 nomDuFichierEncodeEnISO > nomDuFichierEncodeEnUTF8

Un outil pratique pour écrire vos programmes Java est l'environnement de développement intégré (IDE Integrated Development Environment en anglais) Eclipse. Il simplifie l'écriture de code en proposant un certain nombre de raccourcis et d'aide. Il est gratuit et disponible pour la plupart des systèmes d'exploitation. Un rapide aperçu vous est proposé ici.

Vous trouverez ici un lien concernant les TD et les TP qui sont une application directe du cours. La version évoluera en fonction de notre avancement et j'ajouterai quelques corrections (pas toutes).

Vous pouvez également essayer de réaliser ce problème qui vous permettra de réviser les concepts majeurs de swing.

Rappelez vous qu'un langage s'apprend en pratiquant, vous apprendrez bien plus de vos erreurs que de la lecture de code écrit par d'autre, au moins dans un premier temps.

4.1  Corrections

Elles viendront au fil du temps.

5.  Examens et autres désagréments

5.1  Travaux demandés

En général 1 ou 2 dans le semestre.

Vous devez rendre pour le 2 mai un correcteur orthographique :

  1. Manipulation de chaines de caractères ;
  2. Utilisation de collection ;
  3. Lecture écriture de fichier.

Vous devez rendre pour le 25 mars 2016 l'exercice III de TP auquel vous ajouterez :

  1. le produit de deux polynômes par l'algorithme de Karatsuba.
  2. le traitement des exceptions (division par un polynome nul, division impossible).
  3. la possibilité de lire les polynômes dans un fichier.

Le travail à fournir est le code java commenté.

Vous devez rendre pour le 30 mai 2016, l'exercice présenté en TP qui consiste à calculer une valeur approchée de Pi par une méthode de Monte-Carlo. On considère un carré de côté 1 et le quart de cercle inscrit dans ce carré. L'aire du carré est de 1 et celle du quart de cercle de {$\frac{\Pi}{4}$}. Ensuite nous faisons tomber aléatoirement des gouttes de pluie, qui sont soit à l'intérieur du cercle soit à l'extérieur. La probabilité qu'une goutte se situe à l'intérieur du cercle est de {$\Pi/4$}, le nombre de gouttes tombées à l'intérieur du cercle divisé par le nombre de gouttes total nous donne une approximation de {$\Pi/4$}. Vous devez donc :

  1. Représenter le quart de cercle et les gouttes de pluie en utilisant swing ;
  2. Demander le nombre de gouttes à l'utilisateur ;
  3. Mettre deux boutons (marche, arrêt) ;
  4. Afficher la valeur approchée de {$\Pi$} ;

Le travail à fournir est le code java commenté. Vous pourrez compléter votre travail avec une JProgressBar et également un thread s'éxécutant hors de l'EDT calculant {$\Pi$} avec une autre méthode d'approximation comme celle de Leibnitz par exemple : {$$\frac{\pi}{4}=\sum^\infty_{k=0}\frac{(-1)^k}{2k+1}=\frac41-\frac43+\frac45-\frac47+\frac49-\frac4{11}\cdots.\!$$} .

6.  Quelques références