Cours 2
Cours 2
Cours 2
POO-L3 H. Fauconnier 2
Bibliographie
De nombreux livres sur java (attention
java >= 1.5)
En ligne:
http://mindview.net/Books/TIJ4
Thinking in Java, 4th edition Bruce Eckel
http://java.sun.com/docs/index.html
Livre conseillé:
The Java Programming language fourth
edition AW Ken Arnold, James Gosling,
David Holmes
POO-L3 H. Fauconnier 3
Chapitre I
Introduction
A) Généralités
Problème du logiciel:
Taille
Coût : développement et maintenance
Fiabilité
Solutions :
Modularité
Réutiliser le logiciel
Certification
Comment?
POO-L3 H. Fauconnier 5
Typage…
Histoire:
Fonctions et procédures (60 Fortran)
Typage des données (70) Pascal Algol
Modules: données + fonctions regroupées
(80) ada
Programmation objet: classes, objets et
héritage
POO-L3 H. Fauconnier 6
B) Principes de base de la POO
Objet et classe:
Classe = définitions pour des données
(variables) + fonctions (méthodes) agissant
sur ces données
Objet = élément d’une classe (instance)
avec un état
(une méthode ou une variable peut être
de classe = commune à la classe ou
d’instance = dépendant de l’instance
)
POO-L3 H. Fauconnier 7
Principes de bases (suite)
Encapsulation et séparation de la
spécification et de l’implémentation
Séparer l’implémentation de la spécification.
Ne doit être visible de l’extérieur que ce qui est
nécessaire, les détails d’implémentation sont « cachés »
Héritage:
Une classe peut hériter des propriétés d’une
autre classe: un classe peut être une extension
d’une autre classe.
POO-L3 H. Fauconnier 8
Principes de bases de la POO
Mais surtout notion de polymorphisme:
Si une classe A est une extension d’une classe B:
A doit pouvoir redéfinir certaines méthodes (disons f())
Un objet a de classe A doit pouvoir être considéré
comme un objet de classe B
On doit donc accepter :
B b;
b=a; (a a toutes les propriétés d’un B)
b.f()
Doit appeler la méthode redéfinie dans A!
C’est le transtypage
(exemple: méthode paint des interfaces graphiques)
POO-L3 H. Fauconnier 9
Principes de bases
Polymorphisme:
Ici l’association entre le nom ‘f()’ et le code (code
de A ou code de B) a lieu dynamiquement (=à
l’exécution)
Liaison dynamique
On peut aussi vouloir « paramétrer » une classe (ou
une méthode) par une autre classe.
Exemple: Pile d’entiers
Dans ce cas aussi un nom peut correspondre à
plusieurs codes, mais ici l’association peut avoir lieu
de façon statique (au moment de la compilation)
POO-L3 H. Fauconnier 10
C) Comment assurer la
réutilisation du logiciel?
Type abstrait de données
définir le type par ses propriétés (spécification)
Interface, spécification et implémentation
Une interface et une spécification (=les
propriétés à assurer) pour définir un type
Une (ou plusieurs) implémentation du type
abstrait de données
Ces implémentations doivent vérifier la spécification
POO-L3 H. Fauconnier 11
Comment assurer la réutilisation
du logiciel?
Pour l’utilisateur du type abstrait de
données
Accès uniquement à l’interface (pas
d’accès à l’implémentation)
Utilisation des propriétés du type abstrait
telles que définies dans la spécification.
(L’utilisateur est lui-même un type abstrait
avec une interface et une spécification)
POO-L3 H. Fauconnier 12
Comment assurer la réutilisation
du logiciel?
Mais en utilisant un type abstrait
l’utilisateur n'en connaît pas
l’implémentation
il sait uniquement que la spécification du
type abstrait est supposée être vérifiée
par l'implémentation.
Pour la réalisation concrète, une
implémentation particulière est choisie
Il y a naturellement polymorphisme
POO-L3 H. Fauconnier 13
Notion de contrat (Eiffel)
Un client et un vendeur
Un contrat lie le vendeur et le client (spécification)
Le client ne peut utiliser l’objet que par son
interface
La réalisation de l’objet est cachée au client
Le contrat est conditionné par l’utilisation correcte
de l’objet (pré-condition)
Sous réserve de la pré-condition le vendeur s’engage
à ce que l’objet vérifie sa spécification (post-
condition)
Le vendeur peut déléguer: l’objet délégué doit
vérifier au moins le contrat (héritage)
POO-L3 H. Fauconnier 14
D) Un exemple…
Pile abstraite et diverses
implémentations
POO-L3 H. Fauconnier 15
Type abstrait de données
NOM
pile[X]
FONCTIONS
vide : pile[X] -> Boolean
nouvelle : -> pile[X]
empiler : X x pile[X] -> pile[X]
dépiler : pile[X] -> X x pile[X]
PRECONDITIONS
dépiler(s: pile[X]) <=> (not vide(s))
AXIOMES
forall x in X, s in pile[X]
vide(nouvelle())
not vide(empiler(x,s))
dépiler(empiler(x,s))=(x,s)
POO-L3 H. Fauconnier 16
Remarques
Le type est paramétré par un autre
type
Les axiomes correspondent aux pré
conditions
Il n’y pas de représentation
Il faudrait vérifier que cette définition
caractérise bien un pile au sens usuel du
terme (c’est possible)
POO-L3 H. Fauconnier 17
Pile abstraite en java
package pile;
POO-L3 H. Fauconnier 18
Divers
package: regroupement de diverses
classes
abstract: signifie qu’il n’y a pas
d’implémentation
public: accessible de l’extérieur
La classe est paramétrée par un type
(java 1.5)
POO-L3 H. Fauconnier 19
Implémentations
On va implémenter la pile:
avec un objet de classe Vector (classe
définie dans java.util.package) en fait
il s’agit d’un ListArray
Avec un objet de classe LinkedList
Avec Integer pour obtenir une pile de
Integer
POO-L3 H. Fauconnier 20
Une implémentation
package pile;
import java.util.EmptyStackException;
import java.util.Vector;
public class MaPile<T> extends Pile<T>{
private Vector<T> items;
// Vector devrait être remplacé par ArrayList
public MaPile() {
items =new Vector<T>(10);
}
public Boolean estVide(){
return items.size()==0;
}
public T empiler(T item){
items.addElement(item);
return item;
}
//…
POO-L3 H. Fauconnier 21
Suite
//…
public synchronized T dépiler(){
int len = items.size();
T item = null;
if (len == 0)
throw new EmptyStackException();
item = items.elementAt(len - 1);
items.removeElementAt(len - 1);
return item;
}
}
POO-L3 H. Fauconnier 22
Autre implémentation avec listes
package pile;
import java.util.LinkedList;
public class SaPile<T> extends Pile<T> {
private LinkedList<T> items;
public SaPile(){
items = new LinkedList<T>();
}
public Boolean estVide(){
return items.isEmpty();
}
public T empiler(T item){
items.addFirst(item);
return item;
}
public T dépiler(){
return items.removeFirst();
}
}
POO-L3 H. Fauconnier 23
Une pile de Integer
public class PileInteger extends Pile<Integer>{
private Integer[] items;
private int top=0;
private int max=100;
public PileInteger(){
items = new Integer[max];
}
public Integer empiler(Integer item){
if (this.estPleine())
throw new EmptyStackException();
items[top++] = item;
return item;
}
//…
POO-L3 H. Fauconnier 24
Suite…
public synchronized Integer dépiler(){
Integer item = null;
if (this.estVide())
throw new EmptyStackException();
item = items[--top];
return item;
}
public Boolean estVide(){
return (top == 0);
}
public boolean estPleine(){
return (top == max -1);
}
protected void finalize() throws Throwable {
items = null; super.finalize();
}
}
POO-L3 H. Fauconnier 25
Comment utiliser ces classes?
Le but est de pouvoir écrire du code
utilisant la classe Pile abstraite
Au moment de l’exécution, bien sûr, ce
code s’appliquera à un objet concret
(qui a une implémentation)
Mais ce code doit s’appliquer à toute
implémentation de Pile
POO-L3 H. Fauconnier 26
Un main
package pile;
public class Main {
public static void vider(Pile p){
while(!p.estVide()){
System.out.println(p.dépiler());
}
}
public static void main(String[] args) {
MaPile<Integer> p1= new MaPile<Integer>();
for(int i=0;i<10;i++)
p1.empiler(i);
vider(p1);
SaPile<String> p2= new SaPile<String>();
p2.empiler("un");
p2.empiler("deux");
p2.empiler("trois");
vider(p2);
}
}
POO-L3 H. Fauconnier 27
E) java: quelques rappels…
Un source avec le suffixe .java
Une classe par fichier source (en principe)
même nom pour la classe et le fichier source
(sans le suffixe .java)
Méthode
public static void main(String[]);
main est le point d’entrée
Compilation génère un .class
Exécution en lançant la machine java
POO-L3 H. Fauconnier 28
Généralités…
Un peu plus qu’un langage de programmation:
“gratuit”!
Indépendant de la plateforme
Langage interprété et byte code
Portable
Syntaxe à la C
Orienté objet (classes héritage)
Nombreuses bibliothèques
Pas de pointeurs! (ou que des pointeurs!)
Ramasse-miettes
Multi-thread
Distribué (WEB) applet, servlet etc…
url: http://java.sun.com
http://java.sun.com/docs/books/tutorial/index.html
POO-L3 H. Fauconnier 29
Plateforme Java
La compilation génère un .class en bytecode (langage
intermédiaire indépendant de la plateforme).
Le bytecode est interprété par un interpréteur Java
JVM
Compilation javac
interprétation java
POO-L3 H. Fauconnier 30
Langage intermédiaire et
Interpréteur…
Avantage: indépendance de la
plateforme
Échange de byte-code (applet)
Inconvénient: efficacité
POO-L3 H. Fauconnier 31
Plateforme Java
La plateforme java: software au-dessus d’une
plateforme exécutable sur un hardware (exemple
MacOs, linux …)
Java VM
Java application Programming Interface (Java API):
POO-L3 H. Fauconnier 32
Tout un environnement…
Java 2 sdk: JRE (java runtime environment + outils
de développements compilateur, debogueurs etc…)
POO-L3 H. Fauconnier 33
Trois exemples de base
Une application
Une applet
Une application avec interface
graphique
POO-L3 H. Fauconnier 34
Application:
Fichier Appli.java:
/**
* Une application basique...
*/
class Appli {
public static void main(String[] args) {
System.out.println("Bienvenue en L3...");
//affichage
}
}
POO-L3 H. Fauconnier 35
Compiler, exécuter…
Créer un fichier Appli.java
Compilation:
javac Appli.java
Création de Appli.class (bytecode)
Interpréter le byte code:
java Appli
Attention aux suffixes!!!
(il faut que javac et java soient dans $PATH)
Exception in thread "main" java.lang.NoClassDefFoundError:
Il ne trouve pas le main -> vérifier le nom!
Variable CLASSPATH ou option -classpath
POO-L3 H. Fauconnier 36
Remarques
Commentaires /* … */ et //
Définition de classe
une classe contient des méthodes (=fonctions) et des
variables
Pas de fonctions ou de variables globales (uniquement dans
des classes ou des instances)
Méthode main:
public static void main(String[] arg)
public
static
Void
String
Point d’entrée
POO-L3 H. Fauconnier 37
Remarques
Classe System
out est une variable de la classe System
println méthode de System.out
out est une variable de classe qui fait
référence à une instance de la classe
PrintStream qui implémente un flot de
sortie.
Cette instance a une méthode println
POO-L3 H. Fauconnier 38
Remarques…
Classe: définit des méthodes et des variables
(déclaration)
Instance d’une classe (objet)
Méthode de classe: fonction associée à (toute la)
classe.
Méthode d’instance: fonction associée à une
instance particulière.
Variable de classe: associée à une classe (globale
et partagée par toutes les instances)
Variable d’instance: associée à un objet
(instancié)
Patience…
POO-L3 H. Fauconnier 39
Applet:
Applet et WEB
Client (navigateur) et serveur WEB
Le client fait des requêtes html, le serveur
répond par des pages html
Applet:
Le serveur répond par une page contenant des applets
Applet: byte code
Code exécuté par le client
Permet de faire des animations avec interfaces
graphiques sur le client.
Une des causes du succès de java.
POO-L3 H. Fauconnier 40
Exemple applet
Fichier MonApplet.java:
/**
* Une applet basique...
*/
import java.applet.Applet;
import java.awt.Graphics;
public class MonApplet extends Applet {
public void paint(Graphics g){
g.drawString("Bienvenue en en L3...", 50,25);
}
}
POO-L3 H. Fauconnier 41
Remarques:
import et package:
Un package est un regroupement de classes.
Toute classe est dans un package
Package par défaut (sans nom)
classpath
import java.applet.*;
Importe le package java.applet
Applet est une classe de ce package,
Sans importation il faudrait java.applet.Applet
POO-L3 H. Fauconnier 42
Remarques:
La classe Applet contient ce qu’il faut
pour écrire une applet
… extends Applet:
La classe définie est une extension de la
classe Applet:
Elle contient tout ce que contient la classe
Applet
(et peut redéfinir certaines méthodes (paint))
Patience!!
POO-L3 H. Fauconnier 43
Remarques…
Une Applet contient les méthodes paint start et
init. En redéfinissant paint, l’applet une fois
lancée exécutera ce code redéfini.
Graphics g argument de paint est un objet qui
représente le contexte graphique de l’applet.
drawString est une méthode (d’instance) qui affiche une
chaîne,
50, 25: affichage à partir de la position (x,y) à partir du
point (0,0) coin en haut à gauche de l’applet.
POO-L3 H. Fauconnier 44
Pour exécuter l’applet
L’applet doit être exécutée dans un
navigateur capable d’interpréter du
bytecode correspondant à des applet.
Il faut créer un fichier HTML pour le
navigateur.
POO-L3 H. Fauconnier 45
Html pour l’applet
Fichier Bienvenu.html:
<HTML>
<HEAD>
<TITLE> Une petite applet </TITLE>
<BODY>
<APPLET CODE='MonApplet.class' WIDTH=200 Height=50>
</APPLET>
</BODY>
</HTML>
POO-L3 H. Fauconnier 46
Html
Structure avec balises:
Exemples:
<HTML> </HTML>
url:
<a target="_blank" href="http://www.liafa.jussieu.f/~hf">page
de hf</a>
Ici:
<APPLET CODE='MonApplet.class' WIDTH=200 Height=50>
</APPLET>
POO-L3 H. Fauconnier 47
Exemple interface graphique
Fichier MonSwing.java:
/**
* Une application basique... avec interface graphique
*/
import javax.swing.*;
public class MonSwing {
private static void creerFrame() {
//Une formule magique...
JFrame.setDefaultLookAndFeelDecorated(true);
//Creation d'une Frame
JFrame frame = new JFrame("MonSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Afficher un message
JLabel label = new JLabel("Bienvenue en L3...");
frame.getContentPane().add(label);
//Afficher la fenêtre
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
creerFrame();
}
}
POO-L3 H. Fauconnier 48
Remarques
Importation de packages
Définition d’un conteneur top-level JFrame,
implémenté comme instance de la classe JFrame
Affichage de ce conteneur
Définition d’un composant JLabel, implémenté comme
instance de JLabel
Ajout du composant JLabel dans la JFrame
Définition du comportement de la Jframe sur un
click du bouton de fremeture
Une méthode main qui crée la JFrame
POO-L3 H. Fauconnier 49
Pour finir…
Java 1.5 et 6 annotations, types
méthodes paramétrés par des types
Très nombreux packages
Nombreux outils de développement
(gratuits)
eclipse, netbeans..
POO-L3 H. Fauconnier 50
En plus…
POO-L3 H. Fauconnier 51
Entrée-sortie
public static void main(String[] args) {
// sortie avec printf ou
double a = 5.6d ;
double b = 2d ;
String mul = "multiplié par" ;
String eq="égal";
System.out.printf(Locale.ENGLISH,
"%3.2f X %3.2f = %6.4f \n", a ,b , a*b);
System.out.printf(Locale.FRENCH,
"%3.2f %s %3.2f %s %6.4f \n", a, mul,b eq,a*b);
System.out.format(
"Aujourd'hui %1$tA, %1$te %1$tB,"+
" il est: %1$tH h %1$tM min %1$tS \n",
Calendar.getInstance());
// System.out.flush();
POO-L3 H. Fauconnier 52
Sortie
5.60 X 2.00 = 11.2000
5,60 multiplié par 2,00 égal 11,2000
Aujourd'hui mardi, 10 octobre, il est: 15 h
31 min 01
POO-L3 H. Fauconnier 53
Scanner
Scanner sc = new Scanner(System.in);
for(boolean fait=false; fait==false;){
try {
System.out.println("Répondre o ou O:");
String s1 =sc.next(Pattern.compile("[0o]"));
fait=true;
} catch(InputMismatchException e) {
sc.next();
}
}
if (sc.hasNextInt()){
int i= sc.nextInt();
System.out.println("entier lu "+i);
}
System.out.println("next token :"+sc.next());
sc.close();
POO-L3 H. Fauconnier 54
Scanner
if (sc.hasNextInt()){
int i= sc.nextInt();
System.out.println("entier lu "+i);
}
System.out.println("next token :"+sc.next()); sc.close();
String input = "1 stop 2 stop éléphant gris stop rien";
Scanner s = new(Scanner(input).useDelimiter("\\s*stop\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
}
POO-L3 H. Fauconnier 55
Sortie
next token :o
1
2
éléphant gris
rien
POO-L3 H. Fauconnier 56
Les classes…
System
System.out variable (static) de classe
PrintStream
PrintStream contient print (et printf)
System.in variable (static) de classe
InputStream
Scanner
POO-L3 H. Fauconnier 57
Chapitre II
Classes et objets
(rappels)
(mais pas d’héritage)
Classes et objets
I) Introduction
II) Classe: membres et modificateurs
III) Champs: modificateurs
IV) Vie et mort des objets,
Constructeurs
V) Méthodes
VI) Exemple
classes et objets POO-L3 H. Fauconnier 59
I) Introduction
Classe
Regrouper des données et des méthodes
Variables de classe
Méthodes de classe
Classes<->type
Objet (ou instance)
Résultat de la création d’un objet
Variables d’instance
Variables de classe
Toute classe hérite de la classe Object
//…
affiche("un", "deux","trois");
}
}
/**
*
* @author sans
*/
public class Astre {
private long idNum;
private String nom = "<pasdenom>";
private Astre orbite = null;
private static long nextId = 0;
/** Creates a new instance of Astre */
private Astre() {
idNum = nextId ++;
}
POO-L3 H. Fauconnier 87
Extension de classe
Si B est une extension de A
pour les variables:
B peut ajouter des variables (et si le nom est
identique cela occultera la variable de même nom
dans A)
(occulter = continuer à exister mais "caché")
Les variables de A sont toutes présentes pour un
objet A, mais certaines peuvent être cachées
pour les méthodes
B peut ajouter de nouvelles méthodes
B peut redéfinir des méthodes (même signature)
POO-L3 H. Fauconnier 88
Remarques:
pour les variables
c'est le nom de la variable qui est pris en compte (pas le type ni les
droits accès).
dans un contexte donné, à chaque nom de variable ne correspond
qu'une seule déclaration.
(l'association entre le nom de la variable et sa déclaration est faite à
la compilation)
pour les méthodes
c'est la signature (nom + type des paramètres) qui est prise en
compte:
on peut avoir des méthodes de même nom et de signatures
différentes (surcharge)
dans un contexte donné, à un nom de méthode et à une signature
correspondent une seule définition
(l'association entre le nom de la méthode et sa déclaration est faite à
la compilation, mais l'association entre le nom de la méthode et sa
définition sera faite à l'exécution)
POO-L3 H. Fauconnier 89
Extension (plus précisément)
Si B est une extension de A
(class B extends A)
Les variables et méthodes de A sont des
méthodes de B (mais elles peuvent ne pas être
accessibles: private)
B peut ajouter de nouvelles variables (si le nom
est identique il y a occultation)
B peut ajouter des nouvelles méthodes si la
signature est différente
B redéfinit des méthodes de A si la signature est
identique
POO-L3 H. Fauconnier 90
Remarques:
Java est un langage typé
en particulier chaque variable a un type: celui de
sa déclaration
à la compilation, la vérification du typage ne peut
se faire que d'après les déclarations (implicites
ou explicites)
le compilateur doit vérifier la légalité des appels
des méthodes et des accès aux variables:
a.f() est légal si au moment de la déclaration de a il
existe une méthode f() qui peut s'appliquer
a.m est légal si au moment de la déclaration de a il
existe une variable m qui peut s'appliquer
POO-L3 H. Fauconnier 91
En conséquence:
Une variable déclarée comme étant de classe
A peut référencer un objet de classe B ou
plus généralement un objet d’une classe
dérivée de A:
un tel objet contient tout ce qu’il faut pour être
un objet de classe A
Par contre une variable déclarée de classe B
ne peut référencer un objet de classe A:
il manque quelque chose!
POO-L3 H. Fauconnier 92
Affectation downcast/upcast
class A{
public int i;
//...
}
class B extends A{
public int j;
//...
}
public class Affecter{
static void essai(){
A a = new A();
B b = new B();
//b=a; impossible que signifierait b.j??
a=b; // a référence un objet B
// b=a;
b=(B)a; // comme a est un objet B ok!!
}
}
POO-L3 H. Fauconnier 93
Upcasting
Si B est une extension de A, alors un objet de B
peut être considéré comme un objet de A:
A a=new B();
On pourrait aussi écrire:
A a=(A) new B();
l'upcasting permet de considérer un objet d'une
classe dérivée comme un objet d'une classe de base
Upcasting: de spécifique vers moins spécifique (vers
le haut dans la hiérarchie des classes)
l'upcasting peut être implicite (il est sans risque!)
attention
il ne s'agit pas réellement d'une conversion: l'objet n'est
pas modifié
POO-L3 H. Fauconnier 94
Downcasting
Si B est une extension de A, il est possible qu'un objet de A soit en
fait un objet de B. Dans ce cas on peut vouloir le considérer un objet
de B
A a=new B();
B b=(B)a;
Il faut dans ce cas un cast (transtypage) explicite (la "conversion"
n'est pas toujours possible –l'objet considéré peut ne pas être d'un
type dérivé de B)
A l'exécution, on vérifiera que le cast est possible et que l'objet
considéré est bien d'un type dérivé de B
downcasting: affirme que l'objet considéré est d'un type plus
spécifique que le type correspondant à sa décalration (vers le bas dans
la hiérarchie des classes)
le downcasting ne peut pas être implicite (il n'est pas toujours
possibles!)
attention
il ne s'agit pas réellement d'une conversion: l'objet n'est pas modifié
POO-L3 H. Fauconnier 95
Casting
On peut tester la classe avant de faire
du "downcasting":
Base sref;
Derive dref;
if(sref instanceof Derive)
dref=(Derive) sref
POO-L3 H. Fauconnier 96
B) Méthodes: Surcharge
Méthodes et signature:
Signature: le nom et les arguments et leur types (mais pas
le type de la valeur retournée)
Seule la signature compte:
int f(int i)
char f(int i)
Les deux méthodes ont la même signature: c'est interdit
Surcharge possible:
Plusieurs signatures pour des noms différents
int f(int i)
int f(double f)
Le compilateur détermine par le type des arguments quelle
fonction est utilisée (on verra les règles…)
POO-L3 H. Fauconnier 97
Surcharge
Un même nom de fonction pour
plusieurs fonctions qui sont distinguées
par leur signature
(Java, C++, Ada permettent la surcharge
En C ’/’ est surchargé
3/2 division entière -> 1
3.0/2 division réelle -> 1,5
POO-L3 H. Fauconnier 98
Surcharge
public int f(int i){
return i;
}
// public double f(int i){
// return Math.sqrt( i);
// }
public int f(double i){
return (int) Math.sqrt( i);
}
public int f(char c){
return c;
}
POO-L3 H. Fauconnier 99
Remarques
La résolution de la surcharge a lieu à la
compilation
La signature doit permettre cette résolution
(quelques complications du fait du
transtypage:
Exemple: un char est converti en int
Exemple: upcasting
)
Donnera:
f() de B, i=3
g() de A, i=4
a.i=4
((B) a).i=3
}
}
Résultat:
temps=6981893
Rien n'indique que les deux méthodes void f() ont la même
"sémantique". Comment remplir le double contrat?
((EntierChainable)p.depiler()).val());
}
}
UnsupportedOperationException,
IllegalStateException;
}
jButton1ActionPerformed(evt);
}
});
Correspond à la hiérarchie
Le code
import java.awt.*;
import javax.swing.*;
Toolkit thread
donnera:
a1=(i=1,j=2) a2=(i=1,j=2)
Y Z Y[] Z[]
A f(Aref, AD2ref);//a
f(ADD1ref, Aref);//b
AD1 AD2 f(ADD1ref, ADD2ref);//c
f(AD1ref, AD2ref);//d
f(AD2ref, AD1ref);//e
ADD1 ADD2
}
}
// Array
Object[] toArray();
<T> T[] toArray(T[] a);
}
// Bulk operations
boolean containsAll(Collection<?> c); // sous-ensemble
boolean addAll(Collection<? extends E> c); //optionnel- union
boolean removeAll(Collection<?> c); //optionnel- différence
boolean retainAll(Collection<?> c); //optionnel- intersection
void clear(); //optionnel
// Array Operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
// Search
int indexOf(Object o);
int lastIndexOf(Object o);
// Iteration
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
// Range-view
List<E> subList(int from, int to);
}
new Thread(ping).start();
new Thread(pong).start();
}