TD7 - Les spécificateurs et les packages

Exercice 1: Utilisation des spécificateurs

1-
package mycompany.tutorial;

abstract class TestSpecif{
  public int i1=10;
  private int i2=20;
  protected int i3=30;

  public static final void m1(){
   System.out.println("i1="+i1);
  }

  private void m2(){
    i2+=10;
  }

  abstract void m3();
}

A la compilation,  un message informe que la méthode m1() est statique et ne peut donc pas utiliser de variable d'instance telles i1, il faut que i1 soit statique. Dans ce cas, i1 sera défini de cette façon:

public static int i1=10;

2-
int getI2(){
   return this.i2;
}

Cette méthode est un accesseur, elle permet de donner des valeurs de variables privée de l'extérieur de la classe.

3-
void setI2(int i2){
    this.i2=i2;
}

Cette méthode est un modificateur, elle permet de modifier la valeur d'une variable privée de l'extérieur de la classe.

Exercice 2 : Bloquer l'héritage

1-
Pour bloquer l'héritage, il faut définir la classe TestSpecifFille en final :

final class TestSpecifFille extends TestSpecif{
}

2-
Il y a erreur de compilation si l'on tente de surcharger m1():  cette méthode était définie final

3-
final class TestSpecifFille extends TestSpecif{
  void m4(){
    i3+=10;
   //l'opération i2+=10; est interdite car i2 est déclaré 'private' dans la classe TestSpecif .
  }
  void m3(){
    System.out.println(i3);
  }
}


Exercice 3 : Pour en finir avec les spécificateurs...

1-
public static void main(String[] sArgs){
   System.out.println("i1="+i1);
   System.out.println("i2="+getI2());
   System.out.println("i3="+i3);
  }

ne fonctionne pas car:
- La méthode main() qui est dans un contexte statique ne peut appeler getI2() qui n'est pas statique.
- La variable i3 n'est pas statique.

Il suffit alors d'instancier un TestSpecifFille pour se trouver dans un contexte d'instance et plus de classe.

public static void main(String[] sArgs){
   TestSpecifFille tsf=new TestSpecifFille();
   System.out.println("i1="+tsf.i1);
   System.out.println("i2="+tsf.getI2());
   System.out.println("i3="+tsf.i3);
}


Exercice 4 : Utilisation des packages et des jar

1-
Il suffit de créer par les commandes de votre système d'exploitation les répertoires mycompany/tutorial/exemples1:

mkdir -p mycompany/tutorial/exemples1

Dans les sources Java, il faudra préciser:

package mycompany.tutorial.exemples1; en début de source.

2-
Idem

3-
Dans le répertoire courant.

Lancer l'une de ces classes. Que ce passe-t-il et pourquoi?
La JVM léve une NoClassFoundException car elle ne trouve pas les classes.

Comment faut-il organiser les sources et les classes pour faciliter le développement puis permettre à l'application de fonctionner?
Il faut créer l'arborescence ./mycompany/tutorial/exemples1 et les classes doivent se trouver dans ce répertoire.

4-
Il faut se placer dans le répertoire père du répertoire mycompany puis on lance:

java mycompany.tutorial.exemples1.Class1

5-
Se positionner dans le répertoire père du répertoire mycompany et lancer:

jar cvf tutorial.jar mycompany