Langage JAVA Bases du langage Opérations sur les fichiers Réseau Multi-tâche Logiciel: interfaces... Gestion des périphériques (méthodes natives) Accès aux bases de données
Bases du langage Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions
Historique 1990: «Project Green» de Sun ordinateur autonome = le Star 7 Écran LCD 5 '', couleur 240x240, tactile Contrôleur graphique Processeur RISC SPARC Connexion réseau wireless 200 kb/s Équipement multimédia Émetteur/récepteur IR Langage d'origine C++ abandonné Suivi difficile Bugs Carence des outils de conceptions
Historique James Gosling propose le langage Oak: Intégration des aspects «réseaux» Sécurité / fiabilité Indépendant de la plateforme Multi-threading Dynamique Taille de code réduite Simple et «familier»
Historique WWW : au même moment le transport de programme sur internet pose les mêmes contraintes. Langage prévu = HotJava 1996 : La fusion des projets Hotjava et Oak donne le langage java
Technologie Java 4 déclinaisons: 1) JAVA 4..8 MB ROM, >4MB RAM, 32bits, >100MHz Logiciels, serveurs... 2) PersonalJAVA <2MB ROM, 1MB RAM, 32 bits, >50MHz mobiles haut de gamme... 3) EmbeddedJAVA <512kB,<512kB,32 bits,>25mhz mobiles milieu de gamme... 4) JAVACard 16kB, 512B, 8bits, 300 kips horloges, petit matériel
Machine virtuelle Le processeur physique exécute une «machine virtuelle»: c'est un interpréteur de code binaire. JVM : Java Virtual Machine La JVM encapsule le processeur et les fonctions système de l'os (Windows, Unix, Solaris, tinios, symbian...) Dans une technologie donnée, le code binaire est portable. C'est du binaire interprété: le byte-code
Compilation Compilateur / windows A.EXE Fichier source Compilateur / UNIX A.OUT Compilation classique C Seul le code source est portable (pour un ensemble réduit de fonctions) On peut difficement obtenir des informations à partir du code binaire
Compilation Compilateur / windows Fichier source Compilateur / UNIX Byte code Compilation Java Chaque système dispose d'une JVM et d'outils spécifiques «compile once, run anywhere...»
Conséquences Les variables d'un type donné on toujours la même taille qqs le système Pas de signed et unsigned Pas d'accès direct à la mémoire Pas d'inclusion de fichiers, ni de typedef Pas de confusion entier/booléen Accès aux tableaux contrôlés Fonctions (x,y,...) t U { *exceptions*
Éléments du JDK JDK: Java Development Kit javac : le compilateur java : lance la machine virtuelle javah : crée un fichier header pour l'interfaçage avec le C appletviewer : test local d'une applet javap : extrait les prototypes à partir du byte code javadoc : génère la documentation à partir des sources jar : archives...
Applet «Petite application» Intégrée dans une page HTML Exemple http://localhost/htdocs/iris/magasin/magasin.html http://localhost/htdocs/iris/simul/ HTML: <applet> </applet> Suppose que le navigateur intègre déjà une JVM
Applet Source HTML <html> <head> <title>applet Java </title> </head> <body> <applet CODE="ex2.class" WIDTH=200 HEIGHT=50> <param name= "X" value="100" /> Texte visible pour les navigateurs non compatibles... </applet> </body> </html> Formulaire + javascript + java applet paramétrable public String Applet.getParameter(String S)
Applet Fichier Fichier source source JAVA JAVA Fichier HTML javac Fichier Fichier byte-code byte-code CLASS CLASS
Application Classe contenant un main() Une application est (en général) composée de plusieurs classes. Chaque classe peut contenir un main() Le test unitaire en est grandement facilité On exécute le programme de l'une des classes
Application c2.java c1.java ~> javac *.java ~> java c2 javac c2.class c1.class
Application /* Fichier: ex1.java */ import java.io.*; class Ex1 { /* sous programme */ static int somme(int x, int y, int z) { return x+y+z; /* programme principal */ public static void main(string args[]) { System.out.println("Résultat = " + somme(1,2,3)); (style C)
Application /* Fichier: ex1.java */ import java.io.*; class Ex2 { /* sous programme */ int somme(int x, int y, int z) { return x+y+z; /* programme principal */ public static void main(string args[]) { Ex2 E = new Ex2(); System.out.println("Résultat = " + E.somme(1,2,3)); (objet)
Application An général, une application utilise des classes externes, standards ou non. Exemple: jogl.jar xith3d.jar log4j-1.2.11.jar odejava.jar odejava-xith3d.jar Les fichiers «jar» sont des archives. Ils doivent figurer dans la variable d'environnement CLASSPATH pour que les commandes java les trouvent.
CLASSPATH Windows: préciser la variable d'environnement dans les paramètres du
CLASSPATH Dans l'interpréteur de commande: c:\> set CLASSPATH=%CLASSPATH%;jogl.jar;javacomm.jar c:\> Dans un fichier de commande:
CLASSPATH: Linux CLASSPATH = $CLASSPATH:~/jar/jogl.jar:~/jar/RXTXcomm.jar export CLASSPATH Ces lignes peuvent êtres recopiées (une fois pour toutes) dans le fichier ~/.bashrc
Éléments du langage Types
Opérateurs arithmétiques
Opérateurs sur les bits
Opérateurs relationnels
Opérateurs logiques
Classe class maclasse { public int N; protected int pn; private int K; public maclasse() {... public maclasse(int x){... public int method1(){... private void method2(...) { protected float method3() { public static void main(string[] args){...
Objets Un objet est instancié avec l'opérateur new dans : maclasse M1, M2; M1 et M2 sont des identificateurs d'objets ( assimilables à des adresses) pour créer un objet: M1 = new maclasse(); pour récupérer une référence sur l'objet: M2 = M1; M1 et M2 correpondent au même objet physique. M1 M2 maclasse@xxxx maclasse@xxxx Objet maclasse
Objets Il n'y a pas de destructeur. Un objet est «détruit» lorsqu'il n'y a plus de variables à le référencer. M1 = null; M2 = null;... plus rien n'indique où se trouve l'objet Il sera détruit par une tâche qui s'exécute en fond: le «garbage collector» (ramasse miette) On peut provoquer l'exécution du GC avec: System.gc(); mais en général, ce n'est pas la peine.
Classe Object public class java.lang.object{ public native int hashcode(); static {; public java.lang.object(); protected void finalize(); throws java.lang.throwable public final native void notify(); public final native void notifyall(); public final void wait(); throws java.lang.interruptedexception public final native void wait(long); throws java.lang.interruptedexception public final void wait(long,int); throws java.lang.interruptedexception public final native java.lang.class getclass(); protected native java.lang.object clone(); throws java.lang.clonenotsupportedexception public boolean equals(java.lang.object); public java.lang.string tostring(); Toutes les classes héritent implicitement de Object
Classe Class public final class java.lang.class extends java.lang.object implements java.io.serializable { static java.lang.class class$java$lang$class; public native int getmodifiers(); static {; public boolean desiredassertionstatus(); public native boolean isarray(); public native boolean isinterface(); public native boolean isprimitive();... public native java.lang.class getcomponenttype(); public native java.lang.class getdeclaringclass(); public native java.lang.class getsuperclass(); public java.lang.class[] getclasses();...... On peut identifier la classe d'appartenance d'une variable.
Classe String public final class java.lang.string extends java.lang.object implements java.io.serializable,java.lang.comparable,java.lang.charsequence{ public static final java.util.comparator CASE_INSENSITIVE_ORDER; public int hashcode(); public int length(); static {; public java.lang.string(); public byte[] getbytes(); public char[] tochararray(); public char charat(int); public int indexof(int); public int lastindexof(int); public int indexof(int,int); public int lastindexof(int,int); public void getbytes(int,int,byte[],int); java.lang.string(int,int,char[]); public void getchars(int,int,char[],int); public java.lang.string(byte[]); public java.lang.string(byte[],int); public java.lang.string(byte[],int,int); public java.lang.string(byte[],int,int,int); public java.lang.string(char[]); public java.lang.string(char[],int,int);
Classe String static int indexof(char[],int,int,int); static int lastindexof(char[],int,int,int); public java.lang.charsequence subsequence(int,int); public int compareto(java.lang.object); public boolean equals(java.lang.object); public native java.lang.string intern(); public java.lang.string tolowercase(); public java.lang.string touppercase(); public java.lang.string trim(); public static java.lang.string valueof(char); public java.lang.string replace(char,char); public static java.lang.string valueof(double); public static java.lang.string valueof(float); public java.lang.string substring(int); public static java.lang.string valueof(int); public java.lang.string substring(int,int); public boolean regionmatches(int,java.lang.string,int,int); public int compareto(java.lang.string); public int comparetoignorecase(java.lang.string); public int indexof(java.lang.string);
Classe String public int lastindexof(java.lang.string); public java.lang.string(java.lang.string); public boolean endswith(java.lang.string); public boolean equalsignorecase(java.lang.string); public boolean matches(java.lang.string); public boolean startswith(java.lang.string); public byte[] getbytes(java.lang.string); throws java/io/unsupportedencodingexception public int indexof(java.lang.string,int); public int lastindexof(java.lang.string,int); public boolean startswith(java.lang.string,int); public static java.lang.string valueof(boolean); public boolean regionmatches(boolean,int,java.lang.string,int,int); public java.lang.string(byte[],int,int,java.lang.string); throws java/io/unsupportedencodingexception public java.lang.string(byte[],java.lang.string); throws java/io/unsupportedencodingexception
Classe String public static java.lang.string copyvalueof(char[]); public static java.lang.string valueof(char[]); public static java.lang.string copyvalueof(char[],int,int); public static java.lang.string valueof(char[],int,int); public java.lang.string(java.lang.stringbuffer); public boolean contentequals(java.lang.stringbuffer); public static java.lang.string valueof(java.lang.object); public java.lang.string concat(java.lang.string); public java.lang.string[] split(java.lang.string); public java.lang.string[] split(java.lang.string,int); public java.lang.string tolowercase(java.util.locale); public java.lang.string touppercase(java.util.locale); public java.lang.string replaceall(java.lang.string,java.lang.string); public java.lang.string replacefirst(java.lang.string,java.lang.string);
Classe String Un objet de type String n'est pas un tableau de caractères. Le caractère au rang n: char c = S.charAt(n); La longueur de la chaîne: S.length(); Comparer deux chaînes: if (S1.equals(S2)) {...
Les tableaux Les tableaux sont des objets. Exemple avec des entiers: int[] T = new int[1024]; T[i] est le (i+1)ème élément. Exemple avec des objets: String[] TS = new String[256]; for (int i=0; i<ts.length; i++) { TS[I] = new String("ABCDE"); Ne donne pas 256 objets comme en C++ Remarque: TS.length; est le nombre d'éléments du tableau (attribut) TS[i].length(); est le nombre de caractère de la chaîne (méthode)
Les tableaux C:\langage\java\pres>java tab T[0]=0 T[1]=1 T[2]=2 T[3]=3 T[4]=4 T[5]=5 T[6]=6 T[7]=7 T[8]=8 T[9]=9 T[10]=10 T[11]=11 T[12]=12 T[13]=13 T[14]=14 T[15]=15 Exception in thread "main" java.lang.arrayindexoutofboundsexception: 16 at tab.main(tab.java:10) C:\langage\java\pres> Parcours de tableaux: int[] T = new int[16]; for (int i=0; i<t.length; i++) T[i] = i; //... for (int i=0; i<32; i++) System.out.println("T["+i+"]="+T[i]); System.out.println("Fin du programme");
Les exceptions Objectif: prendre en compte les cas «anormaux» dans l'exécution d'un programme Dans la plupart des cas, Java rend obligatoire de prévoir ce qu'il faut faire si tout ne se passe pas comme prévu (ex: ERR d'e/s sur un fichier) Exemple de cas qui échappe à la règle: dépassement d'index dans un tableau (voir l'exemple précédent)
Traitement d'une exception Avec les instructions try catch int[] T = new int[16]; for (int i=0; i<t.length; i++) T[i] = i; //... try { for (int i=0; i<32; i++) System.out.println("T["+i+"]="+T[i]); catch(exception e){ System.out.println("<<ERREUR>>"); System.out.println("Fin du programme"); Si le code du try se passe mal, un objet de type Exception est créé. Le catch capture l'exception
Exceptions Classes pour les exceptions
Exceptions Traitement du plus précis au plus général: try { // code à surveiller catch (RuntimeException r) {... catch (IOException o) {... catch (Exception e) {... catch (Throwable t) {... // traitement de tout ce qui n'a // pas été capturé
Exceptions import java.io.*; class Except { FileReader fr; void fonct() { try { fr = new FileReader(new File("fichier.txt")); catch (IOException e){ System.out.println("Erreur d'ouverture du fichier " + e.getmessage()); public Except(){ fonct(); public static void main(string[] args){ new Except(); Traitement normal
Exceptions: throws import java.io.*; class Except { FileReader fr; void fonct() throws IOException { fr = new FileReader(new File("fichier.txt")); public Except(){ try { fonct(); catch (IOException ioe) { System.out.println(ioe.getMessage()); public static void main(string[] args){ new Except(); L'exception est reportée vers la fonction appelante.
Exceptions: throws import java.io.*; class Except { FileReader fr; void fonct() throws IOException { fr = new FileReader(new File("fichier.txt")); public Except() throws IOException { fonct(); public static void main(string[] args){ try { new Except(); catch (IOException ioe) { System.out.println(ioe.getMessage()); L'exception est reportée vers la fonction appelante.
Exceptions: throws import java.io.*; class Except { FileReader fr; Personne n'en veut... void fonct() throws IOException { fr = new FileReader(new File("fichier.txt")); public Except() throws IOException { fonct(); public static void main(string[] args) throws IOException { new Except(); C:\langage\java\source>java Except Exception in thread "main" java.io.filenotfoundexception: fichier.txt (Le fichie r spécifié est introuvable) at java.io.fileinputstream.open(native Method) at java.io.fileinputstream.<init>(unknown Source) at java.io.filereader.<init>(unknown Source) at Except.fonct(Except.java:6) at Except.<init>(Except.java:9) at Except.main(Except.java:12) C:\langage\java\source> Erreur avec arrêt du programme
Interface L'interface donne un ou plusieurs prototypes de fonctions qui devront être codées dans les classes qui implémentent l'interface import java.awt.*; interface Dessinable { public void dessiner(graphics g); Un objet 'Dessinable' est un objet qui dispose d'une méthode dessiner()
Interface import java.awt.*; class Rond implements Dessinable { int X,Y,R; public Rond(int x, int y, int r){ X=x; Y=y; R=r; public void dessiner(graphics g){ g.setcolor(color.blue); g.filloval(x-r,y-r,2*r,2*r); Si dessiner() n'est pas codé, on obtient le message: % javac Rond.java Rond.java:3: Rond is not abstract and does not override abstract method dessiner(java.awt.graphics) in Dessinable class Rond implements Dessinable { ^ 1 error % _
Interface Dessinable[] TD = new Dessinable[1024];... // remplissage du tableau avec Rond et Rect mélangés TD[k] = new Rect(12,56,6,8);... TD[j] = new Rond(0,0,78);... public void paint(graphics g){ for (int i=0; i<1024; i++) TD[i].dessiner(g); On instancie des Rond et des Rect, mais lorsqu'on les utilise avec les propriétés décrites par l'interface, on peut les assimiler à des entités du type de cette interface.