FAQ (questions fréquemment posées)
Table des matières
- Q: Je ne suis pas sûr que mon archive contienne les sources de mon programme, que faire ?
- Q: Est-il vrai qu'une classe doit forcément avoir un constructeur ?
- Q: Est-ce que le bloc
finally
après untry...catch
est équivalent à un bloc normal ? - Q: Quelle est la différence entre surcharge et redéfinition ?
Q: Je ne suis pas sûr que mon archive contienne les sources de mon programme, que faire ?
Si vous n'êtes pas sûr du contenu d'une archive jar, vous pouvez vérifier son contenu avec la ligne de commande suivante :
jar -tvf monArchive.jar
Si la ligne de commande n'est pas accessible, vous pouvez désarchiver votre jar comme une archive classique avec des logiciels comme 7zip.
Q: Est-il vrai qu'une classe doit forcément avoir un constructeur ?
Oui et non.
Oui, dans un sens, car si elle n'est pas static
, une classe possède obligatoirement et implicitement un constructeur sans argument. En effet, elle possèdera au moins un constructeur sans argument hérité de la classe Object
.
Non, dans le sens où on n'est pas obligé de définir explicitement un constructeur dans une classe car justement elle hérite du constructeur sans argument de la classe Objet
. Par contre, si une classe B
hérite d'une autre classe A
possédant un constructeur avec des arguments, on est obligé de définir un constructeur avec les mêmes arguments que le constructeur de A
dans B
(mais cela Eclipse vous l'indiquera).
Par exemple :
public class A { public A(Object o) { //... } } public class B extends A { public B(Object o) { // constructeur obligatoire super(o); //... } }
Q: Est-ce que le bloc finally
après un try...catch
est équivalent à un bloc normal ?
Non, pour deux raisons :
- Après un bloc
finally
, on ne peut que fermer le bloc, donc on ne peut pas mettre d'autres instructions. - Les instructions contenus dans le bloc
finally
seront forcément exécutées, même s'il y a unreturn
avant.
Par exemple, on considère la classe suivante :
public class TestException { public static int test(int x, int y) { int z = 0; try { System.out.println("on est dans le try"); z = x/y; System.out.println("Valeur de z = " + z); return z; } catch (ArithmeticException ae) { System.out.println("on est dans le catch"); System.out.println(ae.getMessage()); y = 1; z = x/y; System.out.println("Valeur de z = " + z); return z; } finally { System.out.println("on est dans le finally"); } } public static void main (String[] args) { System.out.println("Résultat = " + test(1,0)); } }
L'exécution du main
de cette classe affiche :
on est dans le try on est dans le catch / by zero Valeur de z = 1 on est dans le finally Résultat = 1
Q: Quelle est la différence entre surcharge et redéfinition ?
- la surcharge (ou overloading) consiste à définir une méthode ayant même nom de fonction, même retour, paramètres différents d'une méthode existante dans la classe elle-même ou une super-classe (voir le tutorial officiel).
- la redéfinition (ou overriding) consiste à définir une méthode ayant même nom, même retour, mêmes paramètres, visibilité potentiellement restreinte, et traitement différent d'une méthode existant dans une super-classe (voir le tutorial officiel).
On parle donc de surcharge sans forcément avoir d'héritage, contrairement à la redéfinition qui n'a de sens que pour une méthode héritée d'une super-classe.