Java — fiche de révision (POO)

Définitions à savoir formuler, et bugs conceptuels à repérer.

L'épreuve : pas de code à écrire. Deux types de questions — donner des définitions et trouver des bugs. Les bugs portent sur des erreurs de raisonnement (concepts), pas sur la syntaxe pure (point-virgule, accolades).

Définitions à connaître

Le langage et son exécution

Concepts objet

Types et variables

Tableaux, ArrayList et collections

Membres et méthodes : le static

Classe Compteur static int total = 2 objet c1 nom = "A" objet c2 nom = "B" partagé par les deux
« total » est static : un seul exemplaire dans la classe, partagé. « nom » ne l'est pas : un par objet.

Le reste des membres : Constructeur (appelé automatiquement à la création, même nom que la classe, aucun type de retour ; this(...) appelle un autre constructeur). Destructeur finalize(). Garbage collector (détruit un objet sans référence). this = l'instance courante ; super = la classe parente.

Surcharge vs redéfinition

Héritage, abstrait, final

Interfaces

Packages et droits d'accès

import pour utiliser un package ; java.lang est implicite. Les 4 visibilités :

ModificateurClasseMême packageSous-classeAilleurs
privateouinonnonnon
aucun (package)ouiouinonnon
protectedouiouiouinon
publicouiouiouioui

Conversion de types

Exceptions

Bugs à repérer (centrés concepts)

Des codes qui ont l'air corrects mais appliquent mal une notion.

Héritage & objets

1Redéfinition ratée → en fait une surcharge

class Animal     { public void seReproduire()        { System.out.println("Animal"); } }
class Mammifere extends Animal {
    public void seReproduire(String mode) { ... }   // signature DIFFÉRENTE
}
// Mammifere.seReproduire() affiche "Animal" : on a SURCHARGÉ, pas REDÉFINI.

Pour redéfinir, exactement la même signature. @Override aurait fait échouer la compilation.

2La fille accède à un attribut private de la mère

class Animal { private int poids; }
class Chat extends Animal {
    void afficher() { System.out.println(poids); }   // poids est private → invisible
}

Mettre l'attribut en protected, ou passer par un getter.

3Le parent n'a pas de constructeur sans argument

class Animal { Animal(int poids) { } }       // seul constructeur, avec paramètre
class Chat extends Animal { Chat() { } }     // super() implicite cherche Animal() — absent
// ✅  Chat() { super(0); }

Appeler explicitement super(...).

4super(...) n'est pas la première instruction

Chat(String nom, int poids) {
    this.nom = nom;
    super(poids);   // super(...) doit être la TOUTE première instruction
}

5Classe abstraite mal utilisée

abstract class Animal { abstract void deplacement(); }
class Felin extends Animal { }   // ne définit pas deplacement() → doit l'implémenter
Animal a = new Animal();         // on ne peut pas instancier une classe abstraite

6Redéfinir une méthode final

class Animal { public final void dormir() { } }
class Chat extends Animal { public void dormir() { } }   // dormir() est final → interdit

7== au lieu de .equals() sur des objets

Rectangle r1 = new Rectangle(10, 20);
Rectangle r3 = new Rectangle(10, 20);
if (r1 == r3) ...        // false : deux objets distincts en mémoire
if (r1.equals(r3)) ...   // true si equals compare le contenu

8Héritage multiple de classes

class Camionnette extends Camion, Automobile { }                  // interdit en Java
class Camionnette extends Camion implements ComportementAuto { }  // ✅ une classe + des interfaces

Fil rouge héritage : redéfinition vs surcharge · visibilité héritée (private/protected) · chaînage des constructeurs (super) · abstract/final · référence vs contenu.

ArrayList & collections

1Confondre ArrayList et tableau

liste.length    // length = TABLEAUX
liste[0]        // crochets = tableaux
liste.size()    // ✅ taille d'une ArrayList
liste.get(0)    // ✅ accès à un élément

Tableau = taille fixe (.length) ; ArrayList = taille dynamique (.size()).

2remove(int) supprime par INDICE, pas par valeur

ArrayList<Integer> liste = new ArrayList<>();
liste.add(10); liste.add(20); liste.add(30);
liste.remove(2);   // supprime l'élément à l'INDICE 2 (donc 30), pas la valeur 2

3Supprimer pendant qu'on parcourt

for (int i = 0; i < liste.size(); i++) {
    if (...) liste.remove(i);   // après remove, tout se décale → on saute un élément
}

4IndexOutOfBoundsException

ArrayList<String> l = new ArrayList<>();   // l.size() == 0
l.get(0);   // exception : aucun élément

5Type primitif dans les generics

ArrayList<int> liste;        // pas de primitif dans les generics
ArrayList<Integer> liste;    // ✅ classe enveloppe (Integer, Double…)

Autres pièges conceptuels

1Appel d'un membre non-static depuis main

public class Test {
    int x = 5;
    void afficher() { ... }
    public static void main(String[] a) {
        afficher();              // main est static : pas d'objet "courant"
        Test t = new Test();
        t.afficher();            // ✅ via une instance
    }
}

2Division entière

public void setPourcent(int effectue, int total) {
    pourcent = total / effectue;   // int/int = division ENTIÈRE (3/2 donne 1)
}
pourcent = (float) effectue / total * 100;   // ✅ forcer le flottant

3NullPointerException

String s = null;
int n = s.length();             // NullPointerException à l'exécution
if (s != null) n = s.length();  // ✅

4switch sans break

switch (note) {
    case 1: System.out.print("un");    // pas de break → continue sur case 2
    case 2: System.out.print("deux");
}

5Ordre des catch : général avant précis

catch (Exception e) { ... }             // attrape tout en premier
catch (NumberFormatException e) {...}   // → ce bloc devient inatteignable
// ✅ le plus précis d'abord

Réflexe « chasse au bug » le jour J

  1. Héritage : redéfinition (même signature ?) ou surcharge ? super(...) en premier ? constructeur parent appelé ?
  2. Visibilité : un membre private touché de l'extérieur ou depuis une fille ?
  3. static : un membre d'instance appelé depuis un contexte static (ex. main) ?
  4. abstract / final : instanciation d'une classe abstraite ? redéfinition d'une méthode final ?
  5. Objets : == vs .equals() (référence vs contenu) ?
  6. Listes/tableaux : .length vs .size() ? remove par indice ? indice hors bornes ? suppression en cours de parcours ?
  7. Logique : division entière int/int ? risque de NullPointerException ?
  8. Exceptions : ordre des catch (précis avant général) ?

D'après le cours « Java POO » 2025-2026 (N. Faye). Fiche de révision personnelle.