Leçon 1 et 2 Leçon 3 Leçon 4 Leçon 5
Java est basé sur une vision orientée objet du code de programmation considéré comme un ensemble d'objets. Ce sont les classes qui créent et spécifient les propriétés de ces objets.
Chaque classe est composée de deux parties : les propriétés qui définissent la classe et les fonctions qui permettent de manipuler ces propriétés. Les propriétés, plutôt baptisée champs dans le jargon Java, sont des variables auxquelles une classe peut accéder. Les outils permettant de manipuler les champs sont appelés méthodes.
Une méthode est l'équivalent d'une fonction en C ou C++. Elle se déclare exactement de la même manière : returnType name(parameters) { // body } sauf l'absence du point virgule en fin de déclaration.
Chaque méthode doit renvoyer une valeur à moins d'avoir été déclarée comme void. Exemple :
int surface (
int longueur, int largeur )
{
return longueur * largeur ;
}
En terme de syntaxe, une classe se compose d'une déclaration et d'un corps. Le nom d'une classe doit commencer par une lettre , un caractère "_" ou "$" et ne contenir que des caractères Unicode au-dessus de x00C0.
Une méthode, insérée dans sa classe, donne ceci :
Class Rectangle
{
int i;
int surface ( int longueur, int largeur )
{
return longueur * largeur ;
}
}
Les modifieurs de classe : Protected, private, public, friendly, final, abstract
Une méthode peut être précédée des modifieurs protected, private ou public.
Protected signifie que la méthode est uniquement disponible pour sa classe d'origine et ses classes dérivées. Public signifie que la méthode est disponible pour n'importe quelle classe. Les classes publiques sont accessibles par tous les objets, elles peuvent être utilisées et étendues par n'importe quel objet de n'importe quel package.
Private est utilisé lorsque seule la classe où la méthode a été déclarée peut utiliser celle-ci et même pas les sous-classes. C'est le degré de protection le plus fort applicable à une méthode, une méthode privée n'étant accessible que par les méthodes de la même classe.
Un autre modifieur est friendly. Une méthode friendly est accessible uniquement pour la classe courante et celles qui en sont dérivées. Par défaut, c'est le modifieur retenu pour les classes où d'autres modifieurs n'ont pas été utilisés.
Une version spéciale de la méthode private est appelée private protected. Elle désigne des méthodes accessibles pour une classe et ses sous-classes mais pas pour le reste des classes inscrites dans un package.
Les classes final ne peuvent avoir de sous_classes. En placant le mot clé final en tête de la déclaration d'une méthode, vous empêchez toute sous-classe de modifier une méthode donnée. Ex :
final void toggleStatus()
Les classes abstraites sont des classes dont les méthodes n'ont pas encore été complétées. C'est le travail des sous-classes de ces classes abstraites de finaliser les méthodes. La classe elle-même est considérée comme abstraite et ne peut être initialisée. Constructeurs, méthodes statiques et méthodes privées ne peuvent être abstraites.
Le mot clé abstract est utilisé comme suit :
abstract returnType methodName(parameters)
Une méthode peut être "surchargée" en en déclarant plus d'une version avec des paramètres différents. Exemple :
int surface (int longueur, int largeur);
float surface (float longueur, float largeur);
Le compilateur détermine quelle méthode invoquer en fonction des paramètres passés à cette méthode.
Le modifieur static indique qu'une variable ou une méthode est identique pour toutes les classes. Une variable déclarée comme statique sera la même pour toutes les instances d'une classe. Exemple :
static int version = 1;
Variables et méthodes statiques ont l'avantage de pouvoir être référencées sans qu'une instance spécifique de la classe ne soit créée. C'est par exemple le cas de la méthode System.Out.println où Out est une variable statique qui vous permet de faire appel à la méthode println sans avoir créé au préalable un objet de la classe System.
La méthode de création en Java est une méthode qui porte le même nom que la classe qu'elle doit initialiser et qui n'a pas de valeur de retour.
Exemple :
class Point
{
protected int abscisse, ordonnée;
public Point ( int x , int y)
{
abscisse = x;
ordonnée = y;
}
}
Avant de pouvoir faire appel à une classe, il faut passer par l'opérateur new qui permet de créer une instance de celle-ci.
Exemple :
class Test
{
public static void main (String args[])
{
Point pt = new Point (5,6)
}
}
La méthode finalize permet à un objet de s'en aller proprement (fermeture de fichiers par exemple) avant que le "garbage collector" automatique ne retire l'objet de la mémoire.
void finalize()
{
...
}
Un package est un groupe de classes réunis dans un seul fichier. Les membres d'une classe qui ne sont pas explicitement déclarés comme public, private ou protected ne peuvent être vus que par les classes du même package.
Le fichier à convertir en package doit simplement être préfixé de la sorte :
Pour utiliser une classe appartenant à un package, trois moyens sont disponibles :monpackage.maclasse x = new monpackage.maclasse(1,2)
import monpackage.maclasse
class test {
maclasse x= new maclasse(1,2)
...
}
import monpackage.*
class test {
maclasse x= new maclasse(1,2)
...
}
L'héritage de classe permet d'utiliser une classe existante pour en dériver une autre sans devoir repartir de zéro. A partir d'une classe d'objets comme voiture, il est possible de créer une classe particulière, la 4x4 qui hérite de toutes les propriétés d'une voiture et à laquelle on n'aura plus qu'à ajouter quelques spécifités. Le mot clé extends permet de signaler au compilateur qu'une classe héritera des propriétés d'une autre. Exemple :
class Quatrequatre
extends voiture
{
...
}
Example: native void toggleStatus();
Les méthodes natives sont des méthodes écrites dans d'autres langages de programmation, comme le C++. Elles sont préfixées par le modifieur native en tête de la déclaration de méthode, le corps de la déclaration étant remplacé par un point virgule.
En placant le mot clé synchronized en tête de la déclaration d'une méthode, vous pouvez empêcher la corruption de données pouvant survenir lorsque deux méthodes tentent d'accéder la même portion de données au même moment. Ce mot clé deviendra très important lorsque vous découperez votre application en threads. Ex:
synchronized void BoutonOnOff()
Exceptions
Les exceptions permettent de remédier à tous les problèmes pouvant apparaītre lors de l'exécution d'un programme. Toutes les portions de code susceptibles de générer des erreurs ou des problèmes (division par zéro etc) peuvent être encadrées par le bloc d'instructions try-catch comme suit
Si l'une des instructions contenues dans le bloc try émet une exception, elle est attrapée par l'instruction catch qui va s'occuper d'elle.
Voici une liste non exhaustive d'exceptions classiques
| Exception | Causé par |
| ArithmeticException | Erreur mathématique comme une division par zero |
| ArrayIndexOutOfBoundsException | Mauvais indice dans un tableau |
| ArrayStoreException | Mauvais type de données stocké dans un tableau. |
| FileNotFoundException | Accès à un fichier non existant. |
| IOException | problème de lecture ou écriture sur un disque. |
| NullPointerException | Référence un objet inexistant. |
| NumberFormatException | Conversion incorrecte entre nombres et chaines de caractères |
| OutOfMemoryException | Trop peu de mémoire pour l'allocation d'un objet |
| SecurityException | Action non autorisée par la configuration du navigateur Web |
| StackOverflowException | Stack overflow. |
| StringIndexOutOfBoundsException | Accès à un caractère au-delà d'une chaīne de caractère |
Réalisons une petite application graphique contenant un bouton "Inside Internet". Si l'on clique sur ce bouton, l'URL de votre magazine préféré est composé et affiché dans votre navigateur. Dans le bloc try, nous créons un objet URL à partir de la chaine http://www.best.be. Si cette création échoue, la classe URL génère une exception MalformedURLException et l'exécution du programme continue au niveau du bloc de programme catch
import java.awt.*; // nécessaire pour les librairies graphiques
import java.applet.*;
import java.net.*; // librairie réseau pour la classe URL
public class monurl extends Applet
{
boolean badURL;
public void init()
{
Button button = new Button("Inside Internet"); // création du bouton
add(button);
badURL = false;
}
public void paint(Graphics g)
{
if (badURL)
g.drawString("Bad URL!", 60, 130);
}
public boolean action(Event evt, Object arg)
{
try
{
URL url = new URL("http://www.best.be");
AppletContext context = getAppletContext();
context.showDocument(url);
}
catch (MalformedURLException e)
{
badURL = true;
repaint();
}
return true;
}
}
Code source http://www.netline.be/netline/formations/java/monurl.txt
Le bloc try and catch peut être complété par l'instruction throws comme dans l'exemple suivant où la fonction MyRead ne gère pas elle-même les erreurs d'accès disque mais renvoie l'exception à la méthode appelante. MyRead retourne cette exception parce que nous lui avons ajouté le throws IOException to its signature. N'oubliez pas bien sūr dans ce cas de faire gérer cette exception par la méthode de niveau supérieur.
protected void MyThrows()
{
try
{
MyRead();
}
catch (IOException e)
{
String err = e.toString();
System.out.println(err);
}
}
protected void MyRead() throws IOException
{
System.in.read(buffer, 0, 255);
}
Programmation par événements
En Java, les événements sont en fait des objets d'une classe Event qui définit tous les événements auxquels un programme est susceptible de répondre ainsi que les méthodes par défaut à appliquer pour traiter ou collecter des informations à propos de ces événements. Une action de l'utilisateur au clavier ou à la souris déclenche une série d'événements qui sont transmis à l'application pour traitement éventuel par le programmeur.
| Constant | Description |
| ACTION_EVENT | utilisé avec la méthode action() |
| GOT_FOCUS | Une fenêtre obtient le focus |
| KEY_ACTION | identique à KEY_PRESS. |
| KEY_ACTION_RELEASE | identique à KEY_RELEASE. |
| KEY_EVENT | événement clavier |
| KEY_PRESS | touche enfoncée |
| KEY_RELEASE | touche relachée |
| LIST_DESELECT | déselection d'un item d'une liste |
| LIST_EVENT | événement pour une listbox |
| LIST_SELECT | sélection d'un item d'une liste |
| LOAD_FILE | au chargement d'un fichier |
| LOST_FOCUS | une fenêtre perd le focus. |
| MISC_EVENT | événement divers |
| MOUSE_DOWN | bouton de souris pressé |
| MOUSE_DRAG | déplacement drag and drop de souris |
| MOUSE_ENTER | la souris pénètre dans une fenêtre |
| MOUSE_EVENT | événement souris |
| MOUSE_EXIT | la souris quitte la fenêtre. |
| MOUSE_MOVE | souris déplacée. |
| MOUSE_UP | bouton de souris relāché |
| SAVE_FILE | à la sauvegarde d'un fichier |
| SCROLL_ABSOLUTE | déplacement d'une scrollbar |
| SCROLL_EVENT | événement scrollbar |
| SCROLL_LINE_DOWN | bouton bas d'une scrollbar |
| SCROLL_LINE_UP | bouton haut d'une scrollbar |
| SCROLL_PAGE_DOWN | commande page down d'une scrollbar |
| SCROLL_PAGE_UP | commande page up d'une scrollbar |
| WINDOW_DEICONIFY | fenêtre replacée en position normale |
| WINDOW_DESTROY | destruction d'une fenêtre |
| WINDOW_EVENT | événement fenêtre |
| WINDOW_EXPOSE | fenêtre plein écran |
| WINDOW_ICONIFY | fenêtre mise en icône |
| WINDOW_MOVED | fenêtre déplacée |
Imaginons par exemple un programmeur désireux d'intercepter les déplacements de souris dans son application pour pouvoir concevoir un programme de dessin. Sa première étape sera de réagir lorsque la souris entre ou quitte la fenêtre de son applet. Plutôt que de les laisser traiter par le système, il va demander à traiter lui-même les événements mouseEnter et mouseExit. Il va créer une méthode du même nom que l'événement à traiter dans laquelle le premier argument est event de la classe Event qui contient des infos spécifiques à l'événement généré suivi d'un argument keycode dans le cas d'un événement clavier ou int x, int y dans le cas d'un événement souris.
Code source http://www.netline.be/netline/formations/java/masouris.txt
import java.awt.*;
import java.applet.*;
public class masouris extends Applet
{
String msgStr;
public void init()
{
msgStr = "";
Font font = new Font("Arial", Font.BOLD, 36);
setFont(font);
resize(300, 200);
}
public void paint(Graphics g)
{
g.drawString(msgStr, 40, 120);
}
public boolean mouseEnter(Event evt, int x, int y)
{
msgStr = "Mouse in";
repaint();
return true;
}
public boolean mouseExit(Event evt, int x, int y)
{
msgStr = "Mouse out";
repaint();
return true;
}
}