Podcast
Questions and Answers
Quel concept de la programmation orientée objet le polymorphisme complète-t-il principalement?
Quel concept de la programmation orientée objet le polymorphisme complète-t-il principalement?
- L'abstraction
- L'encapsulation
- L'héritage (correct)
- Le masquage de données
Comment le polymorphisme permet-il de manipuler des objets?
Comment le polymorphisme permet-il de manipuler des objets?
- En utilisant une interface commune sans connaître totalement le type de chaque objet. (correct)
- En convertissant chaque objet vers un type spécifique.
- En connaissant précisément le type de chaque objet.
- En ignorant le type de chaque objet.
Quelle relation est exploitée par le polymorphisme, notamment illustrée par l'expression anglaise 'is a'?
Quelle relation est exploitée par le polymorphisme, notamment illustrée par l'expression anglaise 'is a'?
- Un point coloré partage une relation d'identité avec un point.
- La relation réciproque entre un point et un point coloré est toujours vraie.
- Un point est nécessairement un point coloré.
- Un point coloré est aussi un point. (correct)
Dans le contexte du polymorphisme, que signifie la liaison dynamique?
Dans le contexte du polymorphisme, que signifie la liaison dynamique?
Dans un scénario de polymorphisme avec des classes A, B, C, D, E et F où A est la classe mère et les autres en dérivent, laquelle des affectations suivantes est incorrecte?
Dans un scénario de polymorphisme avec des classes A, B, C, D, E et F où A est la classe mère et les autres en dérivent, laquelle des affectations suivantes est incorrecte?
Dans un contexte de généralisation du polymorphisme avec plusieurs classes, si 'a' est une instance de la classe A et 'b' une instance de la classe B, et que B hérite de A, laquelle des opérations suivantes est valide?
Dans un contexte de généralisation du polymorphisme avec plusieurs classes, si 'a' est une instance de la classe A et 'b' une instance de la classe B, et que B hérite de A, laquelle des opérations suivantes est valide?
Considérons un arbre d'héritage avec une fonction 'f' définie dans certaines classes. Si 'a' est une référence de type A, mais pointe vers un objet de type D (D héritant de A et ayant sa propre implémentation de 'f'), quelle version de 'f' sera appelée?
Considérons un arbre d'héritage avec une fonction 'f' définie dans certaines classes. Si 'a' est une référence de type A, mais pointe vers un objet de type D (D héritant de A et ayant sa propre implémentation de 'f'), quelle version de 'f' sera appelée?
Dans un programme Java, si une méthode 'f(float x)' est définie dans une classe A, et une méthode 'f(int n)' est définie dans une classe B qui hérite de A, comment appelle-t-on le fait que la classe B possède deux méthodes 'f' avec des signatures différentes?
Dans un programme Java, si une méthode 'f(float x)' est définie dans une classe A, et une méthode 'f(int n)' est définie dans une classe B qui hérite de A, comment appelle-t-on le fait que la classe B possède deux méthodes 'f' avec des signatures différentes?
Si une classe B étend une classe A et redéfinit une méthode 'f(float x)' de A, et qu'une instance 'a' de type A est affectée à une instance de type B, lequel des appels suivants est correct en termes de polymorphisme?
Si une classe B étend une classe A et redéfinit une méthode 'f(float x)' de A, et qu'une instance 'a' de type A est affectée à une instance de type B, lequel des appels suivants est correct en termes de polymorphisme?
Pourquoi est-il conseillé d'utiliser la surdéfinition et la redéfinition avec prudence en programmation orientée objet?
Pourquoi est-il conseillé d'utiliser la surdéfinition et la redéfinition avec prudence en programmation orientée objet?
Dans le contexte de la conversion d'arguments effectifs, si une méthode 'identite()' est définie dans la classe A et n'est pas redéfinie dans la classe B qui hérite de A, quel sera le résultat de l'appel Util.f(b)
si b
est une instance de B et Util.f(A a)
appelle a.identite()
?
Dans le contexte de la conversion d'arguments effectifs, si une méthode 'identite()' est définie dans la classe A et n'est pas redéfinie dans la classe B qui hérite de A, quel sera le résultat de l'appel Util.f(b)
si b
est une instance de B et Util.f(A a)
appelle a.identite()
?
Considérant une méthode surdéfinie 'f' dans une classe Util
, avec des signatures f(int n, B b)
et f(float x, A a)
, où B hérite de A, quel appel de méthode serait sélectionné sans nécessiter de conversion?
Considérant une méthode surdéfinie 'f' dans une classe Util
, avec des signatures f(int n, B b)
et f(float x, A a)
, où B hérite de A, quel appel de méthode serait sélectionné sans nécessiter de conversion?
Dans le cas d'une méthode surdéfinie (exemple moins trivial) avec les signatures f(int p, A a)
et f(float x, B b)
, où B hérite de A, quel appel provoquerait une erreur de compilation due à l'ambiguïté?
Dans le cas d'une méthode surdéfinie (exemple moins trivial) avec les signatures f(int p, A a)
et f(float x, B b)
, où B hérite de A, quel appel provoquerait une erreur de compilation due à l'ambiguïté?
Dans le contexte des règles de polymorphisme en Java, laquelle des affirmations suivantes est correcte concernant la conversion implicite?
Dans le contexte des règles de polymorphisme en Java, laquelle des affirmations suivantes est correcte concernant la conversion implicite?
Quelle est la conséquence d'essayer d'affecter une référence à un objet de type T à une référence d'un type ascendant sans conversion explicite?
Quelle est la conséquence d'essayer d'affecter une référence à un objet de type T à une référence d'un type ascendant sans conversion explicite?
Quelle est la méthode recommandée pour vérifier la compatibilité des types en Java lors d'une conversion explicite de référence?
Quelle est la méthode recommandée pour vérifier la compatibilité des types en Java lors d'une conversion explicite de référence?
Quelle est la classe de base dont toutes les classes en Java dérivent implicitement?
Quelle est la classe de base dont toutes les classes en Java dérivent implicitement?
Si une variable est déclarée comme étant de type Object
, que peut-on affirmer quant aux objets qu'elle peut référencer?
Si une variable est déclarée comme étant de type Object
, que peut-on affirmer quant aux objets qu'elle peut référencer?
Si une variable o
est de type Object
et qu'elle référence un objet de type Point
, pourquoi l'instruction o.deplacer()
génère-t-elle une erreur à la compilation, et comment peut-on corriger cela?
Si une variable o
est de type Object
et qu'elle référence un objet de type Point
, pourquoi l'instruction o.deplacer()
génère-t-elle une erreur à la compilation, et comment peut-on corriger cela?
Quel est le but principal de la méthode toString()
dans la classe Object
?
Quel est le but principal de la méthode toString()
dans la classe Object
?
Quelle est la fonctionnalité par défaut de la méthode equals()
héritée de la classe Object
?
Quelle est la fonctionnalité par défaut de la méthode equals()
héritée de la classe Object
?
Dans le contexte des droits d'accès en Java, à quoi sert le modificateur protected
?
Dans le contexte des droits d'accès en Java, à quoi sert le modificateur protected
?
Considérons une classe A avec un membre protected int n
. Si une classe B étend A et une classe C n'a pas de relation d'héritage avec A, mais est dans le même paquetage que A, laquelle des classes peut accéder directement à n
?
Considérons une classe A avec un membre protected int n
. Si une classe B étend A et une classe C n'a pas de relation d'héritage avec A, mais est dans le même paquetage que A, laquelle des classes peut accéder directement à n
?
En Java, laquelle des affirmations suivantes est vraie concernant les tableaux et l'héritage?
En Java, laquelle des affirmations suivantes est vraie concernant les tableaux et l'héritage?
Si B dérive de A, quelle est la relation de compatibilité entre un tableau d'objets de type B et un tableau d'objets de type A?
Si B dérive de A, quelle est la relation de compatibilité entre un tableau d'objets de type B et un tableau d'objets de type A?
Quelle est la principale limitation de l'application du polymorphisme aux tableaux de types primitifs en Java?
Quelle est la principale limitation de l'application du polymorphisme aux tableaux de types primitifs en Java?
Quelle est la conséquence de déclarer une méthode comme final
en Java dans le contexte de l'héritage?
Quelle est la conséquence de déclarer une méthode comme final
en Java dans le contexte de l'héritage?
Que se passe-t-il si une classe est déclarée comme final
en Java?
Que se passe-t-il si une classe est déclarée comme final
en Java?
Considérons le code Java suivant:
class A {
public void f(float x) { }
}
class B extends A {
public void f(float x) { }
public void f(int n) { }
}
A a = new A();
B b = new B();
int n = 5;
a.f(n);
Quelle version de f
est appelée pour a.f(n)
?
Considérons le code Java suivant:
class A {
public void f(float x) { }
}
class B extends A {
public void f(float x) { }
public void f(int n) { }
}
A a = new A();
B b = new B();
int n = 5;
a.f(n);
Quelle version de f
est appelée pour a.f(n)
?
Considérons le code Java suivant:
class Point {
public void afficher() { System.out.println("Point"); }
}
class PointCol extends Point {
public void afficher() { System.out.println("PointCol"); }
}
Point p = new PointCol();
p.afficher();
Quelle sortie sera affichée lors de l'exécution de ce code?
Considérons le code Java suivant:
class Point {
public void afficher() { System.out.println("Point"); }
}
class PointCol extends Point {
public void afficher() { System.out.println("PointCol"); }
}
Point p = new PointCol();
p.afficher();
Quelle sortie sera affichée lors de l'exécution de ce code?
Considérant les classes suivantes:
class A {}
class B extends A {}
class Util {
public static void f(A a) {}
}
Si b
est une instance de B
, que se passe-t-il lors de l'appel Util.f(b)
?
Considérant les classes suivantes:
class A {}
class B extends A {}
class Util {
public static void f(A a) {}
}
Si b
est une instance de B
, que se passe-t-il lors de l'appel Util.f(b)
?
Quel est le principal avantage du polymorphisme en programmation orientée objet?
Quel est le principal avantage du polymorphisme en programmation orientée objet?
Quelle instruction permet de déterminer le type effectif d'un objet en Java lors de l'exécution?
Quelle instruction permet de déterminer le type effectif d'un objet en Java lors de l'exécution?
Lors de l'appel d'une méthode sur un objet, comment le compilateur détermine-t-il quelle signature de méthode utiliser en présence de surdéfinition?
Lors de l'appel d'une méthode sur un objet, comment le compilateur détermine-t-il quelle signature de méthode utiliser en présence de surdéfinition?
Si une méthode est redéfinie dans une sous-classe, et qu'un objet de cette sous-classe est référencé par une variable du type de la super-classe, quelle version de la méthode est exécutée?
Si une méthode est redéfinie dans une sous-classe, et qu'un objet de cette sous-classe est référencé par une variable du type de la super-classe, quelle version de la méthode est exécutée?
Dans quel contexte la ligature dynamique est-elle particulièrement importante en programmation objet?
Dans quel contexte la ligature dynamique est-elle particulièrement importante en programmation objet?
Flashcards
Polymorphisme
Polymorphisme
Concept puissant en P.O.O qui complète l'héritage.
Compatibilité d'affection
Compatibilité d'affection
Une variable objet peut pointer vers un objet d'un type dérivé.
Ligature dynamique
Ligature dynamique
Le choix s'effectue au moment de l'exécution selon le type réel de l'objet.
Traduction du polymorphisme
Traduction du polymorphisme
Signup and view all the flashcards
Compatibilité (polymorphisme)
Compatibilité (polymorphisme)
Signup and view all the flashcards
Ligature statique
Ligature statique
Signup and view all the flashcards
Ligature dynamique
Ligature dynamique
Signup and view all the flashcards
La classe Object
La classe Object
Signup and view all the flashcards
Membres protégés
Membres protégés
Signup and view all the flashcards
Le mot clé 'final'
Le mot clé 'final'
Signup and view all the flashcards
Class et méthodes finales
Class et méthodes finales
Signup and view all the flashcards
Polymorphisme
Polymorphisme
Signup and view all the flashcards
Surdéfinition (Overloading)
Surdéfinition (Overloading)
Signup and view all the flashcards
Redéfinition (Overriding)
Redéfinition (Overriding)
Signup and view all the flashcards
Study Notes
La notion de polymorphisme
- C'est un concept puissant en Programmation Orientée Objet (P.O.O.) qui complète l'héritage.
- Permet de manipuler des objets sans connaître entièrement leur type.
- Exemple de polymorphisme : créer un tableau d'objets de types différents tels que
Point
etPointCol
et appeler la méthodeafficher()
. - Chaque objet réagit selon son type spécifique.
- Exploite la relation « est un » (en anglais « is a »), signifiant qu'un point coloré est aussi un point et peut donc être traité comme tel, mais l'inverse n'est pas vrai.
Les bases du polymorphisme
- Une variable objet peut référencer un objet d'un type dérivé.
- Le choix de la méthode appelée se fait selon le type effectif de l'objet référencé au moment de l'exécution.
- Le polymorphisme se traduit par la compatibilité par affectation entre un type classe et un type ascendant et par la ligature dynamique des méthodes.
Généralisation du polymorphisme à plusieurs classes
- Étant donné une hiérarchie de classes où A est la classe mère et B, C, D, E, F sont des sous-classes, les affectations suivantes sont possibles :
a = b;
(OUI)a = c;
(OUI)a = d;
(OUI)a = e;
(OUI)b = e;
(OUI)c = f;
(OUI)
Application des méthodes dans une hiérarchie de classes
- Si une fonction
f
est définie/redéfinie dans les classes A, C et D (indiqué par un astérisque), la méthode appelée dépend du type de référence. - a référence un objet de type A : méthode
f
de A est appelée. - a référence un objet de type B : méthode
f
de A est appelée. - a référence un objet de type C : méthode
f
de C est appelée. - a référence un objet de type D : méthode
f
de D est appelée. - a référence un objet de type E : méthode
f
de A est appelée. - a référence un objet de type F : méthode
f
de C est appelée.
Polymorphisme, redéfinition et surdéfinition
- Illustration des concepts avec un exemple de code où la classe B étend la classe A.
- La classe A a une méthode
f(float x)
. et la classe B redéfinit la méthodef(float x)
et ajoute une méthodef(int n)
. - Explication du comportement de
a.f(n)
, et deb.f(n)
et enfin dea = b
puisa.f(n)
Explication du polymorphisme
- Bien que
a.f(n)
etb.f(n)
appliquent une méthodef
à un objet de type B, elles n'appellent pas la même méthode. - Pour l'instruction
a.f(n)
, le compilateur recherche la meilleure méthode parmi les méthodes de la classe A ou ses ascendantes, selon les règles de surdéfinition. - Une fois la bonne méthode trouvée, sa signature et son type de retour sont figés.
- Lors de l'exécution, le polymorphisme se base sur la signature et le type de retour définis à la compilation, qui ne sont pas remis en question lors de l'exécution.
Recommandation sur l'utilisation de la surdéfinition et de la redéfinition
- Il est conseillé d'utiliser la surdéfinition et la redéfinition prudemment et de ne pas en abuser, car leur utilisation simultanée peut conduire à des situations complexes.
Conversion des arguments effectifs
- Cas d'arguments de type objet :
- Méthode non surdéfinie et non redéfinie :
- Démonstration avec des classes A et B où B étend A.
- La méthode
identite()
est définie dans A et non redéfinie dans B. - Utilisation de la classe
Util
pour appelerf(A a)
. - L'appel de
Util.f(b)
affiche « Objet de type A ».
- Méthode non surdéfinie et redéfinie :
- La méthode
identite()
est redéfinie dans B. - L'appel de
Util.f(b)
affiche « Objet de type B ».
- La méthode
Conversion des arguments effectifs - Cas 3 : Méthode surdéfinie (exemple simple)
- Démonstration avec des classes A et B étendant A, et une classe Util contenant des méthodes statiques surdéfinies
f(int n, B b)
etf(float x, A a)
. - Les appels :
Util.f(n, b)
appel def(int, B)
sans conversion. Util.f(x, a)
appel def(float, A)
sans conversion.Util.f(n, a)
conversion de n en float pour appelerf(float, A)
.Util.f(x, b)
conversion de b en A pour appelerf(float, A)
.
Conversion des arguments effectifs - Cas 3 : Méthode surdéfinie (exemple moins trivial)
- La classe A et la classe B étendent la classe A.
- La classe Util possède les méthodes
f(int p, A a)
etf(float x, B b)
. - Les appels suivants sont analysés :
Util.f(n, a)
appel def(int, A)
sans conversion.Util.f(x, b)
appel def(float, B)
sans conversion.Util.f(n, b)
ambiguïté car deux possibilités existent.Util.f(x, a)
erreur car aucune méthode ne convient.
Règles du polymorphisme en Java
- Compatibilité : conversion implicite d'une référence à un objet de classe C en une référence à un objet d'une classe ascendante.
- Ligature dynamique : choix de la méthode se fait à la compilation et à l'exécution.
- A la compilation on détermine la signature de la meilleure méthode.
- A l'exécution on recherche la méthode correspondant au type effectif de l'objet.
Conversion explicite de référence
- Il n'est pas possible d'affecter une référence à un objet de type T à un objet d'un type ascendant sans conversion explicite.
- Nécessité d'utiliser l'opérateur de cast pour les types primitifs.
- Conversion acceptée par le compilateur mais vérifiée à l'exécution.
- Utilisation de
instanceof
pour vérifier la compatibilité des types. - Utilisation de
getClass()
pour connaître le type effectif d'un objet.
La super-classe Object
- La classe
Object
est le sommet de la hiérarchie de toutes les classes Java. - Toutes les classes dérivent de la classe
Object
, qu'elles soient prédéfinies ou créées. - Cela équivaut à
class Point extends Object
.
Utilisation d'une référence de type Object
- Une variable de type
Object
peut référencer un objet de type quelconque grâce au polymorphisme. - Ceci permet de manipuler des objets dont le type exact n'est pas connu au moment de l'utilisation.
- Exemple de code :
Point p = new Point(); Object o = p;
l'appel de méthode :((Point) o).deplacer ();
est correct. - La classe
Object
comporte des méthodes que l'on peut utiliser telles quelles ou les redéfinir.toString()
:fournit le nom de la classe et l'adresse de l'objet en hexadécimal.equals()
compare les adresses de deux objets.
Les membres protégés
- Les droits d'accès sont public, private et protected.
- Un membre déclaré
protected
est accessible à ses classes dérivées et aux classes du même paquetage. - Membres
protected
et héritage : Si C n'accède pas à n de B (sauf si B et C sont dans le même paquetage) car aucun lien de dérivation ne relie C à B
Héritage et tableaux
- Les tableaux sont considérés comme des objets, mais ne bénéficient pas de toutes les propriétés des objets car il n'est pas possible de définir leur classe.
- Un tableau peut être considéré comme appartenant à une classe dérivée d'
Object
:Object o = new int[5]; // correct
.
- Il n'est pas possible de dériver une classe d'un tableau :
class Test extends int[]; // erreur
.
Polymorphisme et tableaux
- Le polymorphisme peut s'appliquer aux tableaux d'objets.
- Si B dérive de A, un tableau d'objets de type B est compatible avec un tableau d'objets de type A :
A ta[] ; B tb[] ; ta = tb ; // OK car B dérive de A
- Cette propriété ne s'applique pas aux types primitifs :
int ti[] ; float tf[] ; ti = tf ; // erreur
Classes et méthodes finales
- Le mot clé
final
appliqué à une variable ou à un champ d'une classe interdit la modification de sa valeur. - Appliqué à une classe ou à une méthode, le mot clé `final`` a une signification différente.
- Une méthode déclarée
finale
ne peut pas être redéfinie dans une classe dérivée. - Une classe déclarée
finale
ne peut pas être dérivée.
Studying That Suits You
Use AI to generate personalized quizzes and flashcards to suit your learning preferences.