package com.mtitek.inheritance; public class SuperClass { protected Integer addOperation(Integer value1, Integer value2) { return value1 + value2; } protected Integer multiplyOperation(Integer value1, Integer value2) { return value1 * value2; } }
package com.mtitek.inheritance; public class SubClass extends SuperClass { public Integer multiplyOperation(Integer value1, Integer value2) { return (value1 * value2) * 10; } public Integer subtractOperation(Integer value1, Integer value2) { return (value1 - value2) * 10; } }Dans l'exemple précédent, la classe
SubClass
hérite de la classe SuperClass
.SuperClass
; elle peut les utiliser comme s'elles entaient définies dans la classe SubClass
.multiplyOperation
).SubClass
en héritant le code de la classe SuperClass
.SubClass: public Integer [SuperClass].addOperation(Integer value1, Integer value2) { ... } public Integer [SuperClass].multiplyOperation(Integer value1, Integer value2) { ... } public Integer [SubClass].multiplyOperation(Integer value1, Integer value2) { ... } public Integer [SubClass].subtractOperation(Integer value1, Integer value2) { ... }Les fonctions redéfinies sont toujours disponibles et ne sont pas totalement écrasés et peuvent être accessibles en utilisant le mot clé
super
.protected
,
et si une sous-classe est définie dans un package différent de la superclasse,
alors cette méthode est accessible uniquement dans le code la sous-classe et ne peux pas être invoquée directement en utilisant l'operateur "."
(par exemple, subClassInstance.doCallProtectedMethod()
).
public class TestClass { SuperClass superClass1; SubClass subClass1; }Dans l'exemple précédent la variable
superClass1
peut référencer les instances de la classe SuperClass
ou SubClass
.subClass1
peut référencer uniquement les instances de la classe SubClass
.public class TestClass { public static void main(String[] args) { SuperClass superClass1 = new SuperClass(); // OK : Même type (superClass1 est de type SuperClass qui référence un objet de type SuperClass) SuperClass superClass2 = new SubClass(); // OK : sous-type - SubClass sous-classe de SuperClass (superClass1 est de type SuperClass qui référence un objet de type SubClass) SubClass subClass1 = new SubClass(); // OK : Même type (subClass1 est de type SubClass qui référence un objet de type SubClass) SubClass subClass2 = new SuperClass(); // compiler error: Type mismatch: cannot convert from SuperClass to SubClass SubClass subClass3 = (SubClass) new SuperClass(); // Runtime error: java.lang.ClassCastException: SuperClass cannot be cast to SubClass } }
java.lang.ArrayStoreException
ArrayStoreException
exception if you try to assign an instance of the superclass to the array "p" of type of a superclass.
The exception is to prevent the situation when you will use an element of the array "c" to call a method of the subclass that's no defined in the superclass instance!class P {}
class C extends P {}
C[] c = new C[1]; P[] p = c; p[0] = new P(); // java.lang.ArrayStoreException: // this will prevent: C[0].subclass_method()
refVar1 = refVar2;
),
le compilateur verifie que le type de la variable refVar1
est le même ou un type parent du type de la variable refVar2
.package com.mtitek.overloading; public class TestClass { public static void main(String[] args) { TestClass testClass = new TestClass(); TestClass testClass1 = testClass; // OK : testClass1 et testClass sont du même type Object obj = testClass; // OK : Object est une superclasse de TestClass TestClass testClass2 = obj; // compiler error: Type mismatch: cannot convert from Object to TestClass String str = obj; // compiler error: Type mismatch: cannot convert from Object to String } }
Object obj1 = new String(); // UpCasting implicite Object obj2 = (Object) new String(); // UpCasting expliciteLa conversion (implicite ou explicite) vers un type parent est toujours acceptée par le compilateur et elle ne posera aucun problème à l'exécution du programme : une référence d'un type parent peut, sans risque, lire/modifier les attributs ou invoquer les méthodes dont elle a accès, indépendamment si l'instance référée et du même type ou un sous-type du type de la référence.
String str1 = new Object(); // DownCasting implicite - compiler error: Type mismatch: cannot convert from Object to String) String str2 = (String) new Object(); // DownCasting explicite (erreur à l'exécution : java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.String)La conversion implicite (
String str1 = new Object();
) vers un sous type est toujours refusée par le compilateur.String str2 = (String) new Object();
) vers un sous type est toujours acceptée par le compilateur.
Cependant à l'exécution du programme, la JVM va vérifier si le type de l'instance (Object
) est le même ou un sous type du type qu'on a spécifiée pour la conversion (String
) :
si ce n'est pas le cas, la JVM déclenchera une exception.try-catch
,
et cela même si la redéfinition de cette méthode dans les sous-types ne déclenche aucune exception.public class TestClass { public static void main(String[] args) { SuperClass superClass1 = new SuperClass(); SuperClass superClass2 = new SubClass(); SubClass subClass1 = new SubClass(); superClass1.multiplyOperation(1, 2); // la méthode implémentée dans SuperClass sera exécutée superClass2.multiplyOperation(1, 2); // la méthode implémentée dans SubClass sera exécutée subClass1.multiplyOperation(1, 2); // la méthode implémentée dans SubClass sera exécutée } }Pour invoquer la méthode (
multiplyOperation
) de la superclasse (SuperClass
) au lieu de la méthode redéfinie dans la sous-classe (SubClass
),
il faut utiliser le mot clé super
qui est disponible à partir du code de la sous-classe.