Introduction au langage Java 1 Introduction : Langage développé par Sun et purement orienté objet. N a pas de rapport direct avec Javascript développé par Netscape. Les applications java peuvent être des applications consoles ou graphiques ou encore des applets à exécuter depuis une page html. 1.1 Le principe d exécution d une applet : Java est langage qui doit être compilé et interprété : Dans une première phase, vous compilez un programme (un ou plusieurs fichiers source.java) en fichiers.class L'ensemble des fichiers.class est ensuite interprété par la Machine Virtuelle Java (Java Virtual Machine) pour exécuter le programme. Voici une illustration de ce principe : Applet1.html Applet1.java class Applet1 extends Applet... Applet1.class (micro_code java) <html> <body> <applet code="applet1.java"> </applet> </body> </html> CodeCouleur.java class CodeCouleur... Compilateur java javac CodeCouleur.class (micro_code java) machine virtuelle java testcodecouleur.java class testcodecouleur... testcodecouleur.class (micro_code java) console.bat %JDK%/bin/java CodeCouleur.testCodeC ouleur Pourquoi ne pas interpréter directement le programme Java? 1. Les fichiers.class contiennent du bytecode (code machine Java) qui sera exécuté beaucoup plus rapidement par l'interpréteur que si ce dernier devait travailler avec les fichiers sources.java. 2. Seuls les fichiers.class sont nécessaires à l'exécution d'un programme Java. Comme ils contiennent du code machine, ils ne peuvent être lus par des tiers, protégeant ainsi le code source. 3. Etant compilés, les fichiers.class sont de taille plus petite que le code source Java ; ceci est un argument important pour transférer les programmes sur Internet. 4. Chaque fichier.class décrivant une classe d'objet, une même classe peut être utilisé par différents programmes, sans que cette classe ne soit dupliquée dans chacun des programmes. Pourquoi ne pas compiler directement un exécutable? Un exécutable contient du code qui n'est exécutable que sur la machine pour lequel il est destiné et le seul moyen de rendre un langage multi-plateforme sans avoir à recompiler le source (comme en C/C++), c'est d'utiliser un interpréteur appelée machine virtuelle. L'autre avantage de l'interpréteur est qu'il peut être incorporé par exemple, à un navigateur ce qui lui permet d'exécuter des programmes Java à l'intérieur de pages HTML. JlPascal 1/1
1.2 La Composition du Java developpement kit: Les classes standard sous la forme classes.zip, javac, le compilateur, java, l'interpréteur, jar, l archiveur, appletviewer, l'interpréteur d'applets 1.3 La chaîne de production : MonApplet.java compilateur java MonApplet.class Archivage MonApplet.jar 1.4 L exécution : On utilise une balise <applet> où on indique la classe ou une archive la contenant. L exécution peut être locale (mode file) ou distante (http) : dans ce cas l applet est téléchargée depuis un serveur web puis exécutée sur la machine : nécessite que le navigateur prenne en charge les applets. 1.5 Les différentes versions : Où trouver le JDK : Il est disponible gratuitement sur le site Java de Sun http://www.javasoft.com/. La version 1.6 est désormais disponible (La dénomination Java 2 regroupe les JDK de version >= 1.2). 1.6 Notre outil de développement : Jbuilder de Borland : Les sources se développent avec n importe quel éditeur de texte ou avec Jbuilder (on bénéficie d un assistant). Pour la création des classes et des archives, on peut procéder de 2 manières : Utiliser l interface de Jbuilder si la version le permet. Utiliser le compilateur javac et l archiveur jar faisant partie du JDK de sun avec des fichiers de commandes (extension bat) : SET JDK=d:\JBuilder7\jdk1.3.1 %JDK%\bin\javac -d classes src\codecouleur\*.java %JDK%\bin\jar cvf CodeCouleur.jar -C classes 2 Exemple : code couleur des résistances : 2.1 Première partie : développement de la classe et test en mode console : Fichier de commande : SET JDK=d:\JBuilder7\jdk1.3.1 %JDK%\bin\java -classpath.\classes; CodeCouleur.testCodeCouleur ou %JDK%\bin\java -classpath CodeCouleur.jar CodeCouleur.testCodeCouleur Résultats : JlPascal 2/2
TestCodeCouleur.java package CodeCouleur; import java.io.*; class testcodecouleur public static void main(string[] args) //************************************ System.out.println("test classe CodeCouleur "); String chaine ; CodeCouleur macouleur = new CodeCouleur(); do System.out.print ("valeur de resistance "); chaine = saisir (); if (chaine.compareto("*")!= 0) int r = Integer.parseInt (chaine); macouleur.setvaleur(r); Color couleur1 = macouleur.getcolors(1); Color couleur2 = macouleur.getcolors(2); Color couleur3 = macouleur.getcolors(3); System.out.println ("couleurs = " + couleur1.tostring() + couleur2.tostring() +couleur3.tostring()); while (chaine.compareto("*")!=0); static String saisir () //*********************** DataInputStream reponse; reponse = new DataInputStream(System.in); String chaine = null; try chaine = reponse.readline(); catch (Exception e) ; return chaine; // fin saisir package CodeCouleur; class CodeCouleur CodeCouleur.java private int r; private Color table[] = Color.black, Color.black, Color.red, Color.orange, Color.yellow, Color.green,Color.blue, Color.magenta, Color.gray, Color.white ; public CodeCouleur() this.r = 0; this.table[1] = new Color (0x66,0x33,0) ; // brun public boolean setvaleur ( int valeur ) if (valeur > 0) this.r = valeur; return true; else return false; public Color getcolors ( int anneau) if (r == 0) return Color.pink; Color couleuranneau = Color.pink; double log10 = Math.log((double)this.r)/Math.log(10.0); int C3 = (int)log10-1 ; int C1 = (int)(this.r/math.pow (10.0, C3+1.0)); int C2n = this.r-c1*(int)math.pow (10.0, C3+1.0); int C2d = (int)math.pow (10.0, (double)c3); int C2 = C2n/C2d; switch (anneau) case 1: couleuranneau = table[c1]; case 2: couleuranneau = table[c2]; case 3: couleuranneau = table[c3]; return couleuranneau; break; break; break; JlPascal 3/3
2.2 Seconde partie : réutilisation de la classe dans une applet : Résultats avec l appletviewer intégré à Jbuilder : Utilisation d une page html et d un navigateur : Applet1.html <html><head><title>page de test HTML</title></head> <body> CodeCouleur.Applet1 apparaîtra ci-dessous dans un navigateur Java.<br/> <applet codebase = "." code = "CodeCouleur.Applet1.class" name = "AppletTest" width = "400" height = "300"></applet> </body></html> Utilisation d une archive : On ajoute l attribut archive = "CodeCouleur.jar" (voir fabrication précédemment) JlPascal 4/4
package CodeCouleur; Applet1.Java import java.awt.event.*; import java.applet.*; public class Applet1 extends Applet private Label label1 = new Label(); private Button button1 = new Button(); private TextField textfield1 = new TextField(); private..; public Applet1() public void init() try jbinit(); catch(exception e) e.printstacktrace(); private void jbinit() throws Exception label1.setfont(new java.awt.font("serif", 3, 20)); label1.settext("code Couleur des résistances"); label1.setbounds(new Rectangle(35, 18, 260, 17)); this.setlayout(null); button1.setlabel("calcul"); void button1_actionperformed(actionevent e) CodeCouleur macouleur = new CodeCouleur (); int r = Integer.parseInt (this.textfield1.gettext()); macouleur.setvaleur( r); this.textfield2.setbackground( macouleur.getcolors (1)); this.textfield3.setbackground( macouleur.getcolors (2)); this.textfield4.setbackground( macouleur.getcolors (3)); 2.3 Rendre une applet dynamique : Pour éviter de cliquer le bouton pour que le calcul se fasse, on ajouter un timer. C est particulièrement utile si l applet à développer doit surveiller par exemple les entrées d un automate. Les lignes à modifier sont les suivantes : public class Applet1 extends Applet implements Runnable.. private Thread m_timer; JlPascal 5/5
public void init() try jbinit(); catch(exception e) e.printstacktrace(); System.out.println("Creation du thread timer"); m_timer = new Thread (this); m_timer.start(); public void run() System.out.println("demarre du thread timer"); while (true) CodeCouleur macouleur = new CodeCouleur (); int r = Integer.parseInt (this.textfield1.gettext());.. this.textfield4.setbackground( couleur3); try m_timer.sleep(1000); catch (Exception e) ;.. 3 Eléments de programmation 3.1 La classe String (ou string) : Tout comme dans le langage javascript, on utilise la classe length ( ) : méthode d'instance qui retourne la longueur de la chaîne. charat ( ) : méthode d'instance qui retourne le char qui occupe dans la chaîne s la position précisée par l'argument. concat( ) : cette méthode d'instance concatène la chaîne passée comme argument à la chaîne utilisée comme préfixe. Pour concaténer deux chaînes il est plus simple d'utiliser le signe +. equals( ) : méthode booléenne d'instance qui compare la chaîne passée comme argument à la chaîne utilisée comme préfixe. indexof( ) : méthode d'instance qui retourne la position de la première occurrence du char passée comme argument dans la chaîne utilisée comme préfixe. La méthode retourne -1 si le caractère n'existe pas. lastindexof( ) qui retourne la position de la dernière occurrence de la partie cherchée. substring ( ) : cette méthode d'instance permet d'extraire une sous-chaîne de la chaîne utilisée comme préfixe. tolowercase( ) et touppercase( ) : méthodes d'instance qui modifient si nécessaire la casse de la chaîne utilisée comme préfixe. trim ( ) : méthode d'instance supprime les caractères "espace" placés en début et en fin de chaîne. valueof ( ) : méthodes de classe qui assurent la conversion de l'argument (booléen, char, int, double, float, double) en chaîne. 3.2 Les types primitifs, les classes enveloppes : byte 1 float 4 short 2 double 8 int 4 char 2 long 8 String str = "2.1728"; float f = Float.parseFloat(str); System.out.println ("Convertion string " + str + " en float " + f); double d = Double.parseDouble(str); System.out.println ("Convertion string " + str + " en double " + d); str = "-3"; int i = Integer.parseInt(str); System.out.println ("Convertion string " + str + " en integer " + i); JlPascal 6/6
short s = Short.parseShort(str); System.out.println ("Convertion string " + str + " en short " + s); byte b = Byte.parseByte(str); System.out.println ("Convertion string " + str + " en byte " + b); f = 3.14159f; str = String.valueOf(f); System.out.println ("Convertion float " + f + " en string " + str); d = 2.1828; str = String.valueOf(d); System.out.println ("Convertion double " + d + " en string " + str); i = 1664; str = String.valueOf(i); System.out.println ("Convertion integer " + i + " en string " + str); s = 256; str = String.valueOf(s); System.out.println ("Convertion short " + s + " en string " + str); b = 127; str = String.valueOf(b); System.out.println ("Convertion byte " + b + " en string " + str); f = 3.14159f; d = (double)f; System.out.println ("Convertion float " + f + " en double " + d); f = (float)d; System.out.println ("Convertion double " + d + " en float " + f); b = 65; char c = (char)b; System.out.println ("Convertion byte " + b + " en char " + c); 3.3 Les tableaux & les constantes : Allocation statique Allocation dynamique private Color table[] = Color.black, Color.black, final int NBCOULEURS = 10; Color.red, Color.orange, Color.yellow, Color table [] = new Color[NBCOULEURS] ; Color.green,Color.blue, Color.magenta, Color.gray, Color.white ; Le mot clé final fait office de constante : NBCOULEURS ne peut être modifié. 3.4 Passage de paramètres : Les passages de paramètres se font par valeur pour les types primitifs et par référence pour les objets et les tableaux. 3.5 Les exceptions : Une méthode qui est susceptible de déclencher une exception peut s'écrire ainsi : class Classe1 void methode1 () throws Exception // En cas d'erreur, déclenchement d'une exception throw new Exception (); Et elle peut être appelée ainsi par une autre classe de 2 façons différentes class Classe2 Classe1 objet1 = new Classe1 (); void methodex () try objet1.methode1 (); catch (Exception exception1) // Que faire en cas de problème? finally // Le bloc finally est optionnel // Que faire après? void methodey () throws Exception objet1.methode1 (); 3.6 Les calculs mathématiques : Tout comme dans le langage javascript, on utilise la classe Math et ses méthodes static (on ne créée pas d objets mais on appelle directement les méthodes de la classe). JlPascal 7/7
3.7 Différence de notation pour les objets avec le C++ : A la différence du C++ et tout comme le C#, les symboles -> et :: disparaissent au profit du point. Langage Java Langage C++ Création d objets CodeCouleur macouleur = new CodeCouleur(); CodeCouleur macouleur ; ou CodeCouleur *macouleur = new CodeCouleur(); Appels de méthodes macouleur.setvaleur(r); macouleur.setvaleur(r); ou macouleur->setvaleur(r); Appels de méthodes static CodeCouleur.getTolerance() CodeCouleur ::gettolerance() Utilisation des packages ou espaces de noms java.awt.color couleuranneau ; System::Drawing.Color couleuranneau ; ou ou import java.awt.* ; using namespace System::Drawing; Color couleuranneau ; Color couleuranneau ; 3.8 Faire du graphique : Au lieu d utiliser des objets textbox ou labels, on peut directement dessiner avec une applet. En effet, en plus des 4 méthodes héritées de la classe Applet, les méthodes paint & repaint() sont disponibles : import java.applet.*; public class Cercle extends Applet implements Runnable int pos=10; Thread m_timer; public void init() m_timer = new Thread (this); m_timer.start(); // fin init public void run() while (true) pos++; repaint(); try m_timer.sleep(1000); catch (Exception e) ; // fin run public void paint(graphics g) g.setcolor (Color.blue); g.drawoval(100, 100, pos, pos) ; // fin paint // fin classe JlPascal 8/8
4 Réutilisation de la classe dans une application graphique : package CodeCouleur; FCouleur.java import javax.swing.uimanager; public class FCouleur public FCouleur() CadreCouleur frame = new CadreCouleur(); frame.validate(); //Centrer la fenêtre Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension framesize = frame.getsize(); if (framesize.height > screensize.height) framesize.height = screensize.height; if (framesize.width > screensize.width) framesize.width = screensize.width; frame.setlocation((screensize.width - framesize.width) / 2, (screensize.height - framesize.height) / 2); frame.setvisible(true); public static void main(string[] args) new FCouleur(); // fin main // fin class package CodeCouleur; CadreCouleur.java import java.awt.event.*; import javax.swing.*; public class CadreCouleur extends JFrame private JPanel contentpane; private BorderLayout borderlayout1 = new BorderLayout(); private TextField textfield1 = new TextField(); private TextField textfield2 = new TextField(); private TextField textfield3 = new TextField(); private TextField textfield4 = new TextField(); private Label label1 = new Label(); private Label label2 = new Label(); private TextField textfield5 = new TextField(); private Button button1 = new Button(); public CadreCouleur() try jbinit(); JlPascal 9/9
catch(exception e) e.printstacktrace(); private void jbinit() throws Exception enableevents(awtevent.window_event_mask); contentpane = (JPanel) this.getcontentpane(); contentpane.setlayout(borderlayout1); this.setsize(new Dimension(400, 300)); this.settitle("code couleur des résistances"); textfield1.setbounds(new Rectangle(151, 93, 82, 28)); this.getcontentpane().setlayout(null); textfield2.setbounds(new Rectangle(66, 154, 30, 84)); textfield3.setbounds(new Rectangle(105, 154, 30, 84)); textfield4.setbounds(new Rectangle(147, 154, 30, 84)); label1.setfont(new java.awt.font("dialog", 3, 18)); label1.settext("code couleur des résistances"); label1.setbounds(new Rectangle(62, 26, 293, 40)); label2.setfont(new java.awt.font("dialog", 1, 16)); label2.settext("valeur?"); label2.setbounds(new Rectangle(58, 99, 74, 17)); textfield5.setbackground(color.lightgray); textfield5.settext(" "); textfield5.setbounds(new Rectangle(193, 154, 33, 86)); button1.setfont(new java.awt.font("dialog", 1, 12)); button1.setlabel("calcul"); button1.setbounds(new Rectangle(268, 196, 75, 27)); button1.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) button1_actionperformed(e); ); this.getcontentpane().add(label1, null); this.getcontentpane().add(label2, null); this.getcontentpane().add(button1, null); this.getcontentpane().add(textfield1, null); this.getcontentpane().add(textfield2, null); this.getcontentpane().add(textfield3, null); this.getcontentpane().add(textfield4, null); this.getcontentpane().add(textfield5, null); protected void processwindowevent(windowevent e) super.processwindowevent(e); if (e.getid() == WindowEvent.WINDOW_CLOSING) System.exit(0); void button1_actionperformed(actionevent e) CodeCouleur macouleur = new CodeCouleur(); int r = Integer.parseInt (this.textfield1.gettext()); macouleur.setvaleur( r); this.textfield2.setbackground( macouleur.getcolors (1)); this.textfield3.setbackground( macouleur.getcolors (2)); this.textfield4.setbackground( macouleur.getcolors (3)); JlPascal 10/10
Archive.bat SET JDK=d:\JBuilder7\jdk1.3.1 %JDK%\bin\jar cvf AppliCodeCouleur.jar -C classes. pause Appli.bat SET JDK=d:\JBuilder7\jdk1.3.1 %JDK%\bin\java -classpath.\applicodecouleur.jar; CodeCouleur.FCouleur pause JlPascal 11/11