Dans le monde de la programmation orientée objet (POO), le polymorphisme et la réécriture sont des concepts clés qui apportent flexibilité et vitalité aux langages de programmation. Java, étant un langage POO puissant, prend entièrement en charge ces fonctionnalités. Cependant, il est crucial de comprendre que ces caractéristiques s’appliquent aux méthodes Java et non aux variables. Dans cet article, nous explorerons pourquoi les variables en Java ne suivent pas le polymorphisme et la substitution pour mieux comprendre le comportement des variables de Java.
Le polymorphisme est un mot grec signifiant « plusieurs formes » et constitue un concept de base de la POO. Il permet à des objets de différents types d'être traités comme des objets d'un supertype commun, permettant ainsi d'écrire du code plus flexible et réutilisable. En Java, le polymorphisme est obtenu grâce à l'héritage, aux interfaces et au remplacement de méthodes.
Voyons un exemple
class Animal { void sound() { System.out.println("The animal makes a sound"); } } class Cat extends Animal { @Override void sound() { System.out.println("The cat meows"); } } public class Main { public static void main(String[] args) { Animal myAnimal = new Cat(); myAnimal.sound(); } }
The cat meows
Dans ce scénario, myAnimal est la variable de référence Animal pointant vers l'objet Cat. Lorsque la méthode sound() est appelée sur myAnimal, la version de la classe Cat est appelée, pas la version de la classe Animal. Il s'agit d'un polymorphisme, dans lequel la méthode à appeler est déterminée par le type d'objet réel et non par le type de référence.
Le remplacement de méthode est une forme spécifique de polymorphisme en Java, où une sous-classe fournit une implémentation spécifique d'une méthode définie dans sa superclasse. Les méthodes des sous-classes doivent avoir le même nom, le même type de retour et les mêmes paramètres que les méthodes de la superclasse.
Pourquoi les variables ne suivent-elles pas le polymorphisme et la substitution ? Contrairement aux méthodes, les variables en Java ne suivent pas les concepts de polymorphisme et de substitution. Cette différence provient de différences fondamentales dans la façon dont les méthodes et les variables existent et fonctionnent dans les objets
En Java, les variables d'instance appartiennent aux instances d'une classe, ce qui signifie que chaque instance a sa propre copie de la variable d'instance. Par conséquent, la modification de la valeur d’une variable d’instance dans un objet n’affecte pas les autres objets de la même classe.
Les méthodes, en revanche, appartiennent à la classe elle-même et non à une instance spécifique. Cela signifie que les méthodes, contrairement aux variables, n'ont pas de copie distincte pour chaque objet de la classe.
Reprenons l'exemple précédent, mais cette fois ajoutons des variables d'instance :
class Animal { String sound = "The animal makes a sound"; void makeSound() { System.out.println(sound); } } class Cat extends Animal { String sound = "The cat meows"; @Override void makeSound() { System.out.println(sound); } } public class Main { public static void main(String[] args) { Animal myAnimal = new Cat(); myAnimal.makeSound(); System.out.println(myAnimal.sound); } }
The cat meows The animal makes a sound
Dans ce code, myAnimal est une référence Animal pointant vers l'objet Cat. L'appel de la méthode makeSound() sur myAnimal affichera "Le chat miaule", mais la ligne System.out.println(myAnimal.sound) affichera "L'Animal fait un son". Pourquoi cela arrive-t-il ? Puisque la méthode suit le polymorphisme, la méthode makeSound() de la classe Cat est exécutée. Cependant, comme les variables ne suivent pas le polymorphisme, la "variable sonore" de la classe Animal est utilisée
Ce comportement est dû au principe de masquage variable. Si une variable d'une sous-classe porte le même nom qu'une variable de sa superclasse, la variable de sous-classe masque la variable de superclasse
Cela ne signifie pas que la variable de superclasse a été remplacée. Les deux variables existent toujours indépendamment et la variable utilisée est déterminée par le type de référence et non par le type d'objet réel. C'est pourquoi lorsque nous accédons à la variable sound via la référence Animal, nous obtenons la valeur sonore de la classe Animal au lieu de la classe Cat.
En Java, les variables ne sont pas affectées par le remplacement de méthodes similaires. Au lieu de cela, ils suivent le principe du masquage des variables. Il existe une différence fondamentale entre le masquage de variables et le remplacement de méthode :
Method Overriding - En remplacement, une sous-classe fournit une implémentation différente d'une méthode déjà définie dans sa superclasse. La décision quant à la méthode à appeler est basée sur le type de l'objet réel, plutôt que sur le type de référence, ce qui permet le polymorphisme.
Masquage de variable - Lors du masquage de variable, si une variable d'une sous-classe a le même nom qu'une variable de sa superclasse, la variable de sous-classe masquera la variable de superclasse. La décision quant à la variable à utiliser est basée sur le type de référence et non sur le type de l'objet réel.
Ces principes découlent du fait que les méthodes représentent le comportement, tandis que les variables représentent l'état. Le comportement peut être polymorphe et remplacé, permettant à différents types d'objets d'avoir des comportements différents. En revanche, l’état représenté par une variable appartient à une instance spécifique et n’est pas polymorphe.
En résumé, comprendre pourquoi les variables en Java ne suivent pas le polymorphisme et la substitution peut fournir des informations importantes sur le fonctionnement de Java. Cette connaissance est cruciale pour les programmeurs Java afin d'éviter les malentendus et les erreurs lors de l'utilisation de l'héritage et du polymorphisme
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!