web-dev-qa-db-fra.com

Instanceof renvoie-t-il true si l'instance d'un parent?

J'ai une classe Child qui étend Parent.

Parent child = new Child();

if (child instanceof Parent){
    // Do something
}

Est-ce que cela retourne vrai ou faux, et pourquoi?

43
ikbal

Oui , ce serait. Et pourquoi ne devrait-il pas?

Parce que child est en fait une instance de Parent. Si vous souhaitez effectuer une opération uniquement pour un enfant, vous devez vérifier 

if (child instanceof Child){
}

Cependant, vous devez vous rappeler la déclaration suivante de Effective C++, de Scott Meyers:

"Chaque fois que vous vous trouvez en train d'écrire Code de la forme" si l'objet est de tapez T1, puis faites quelque chose, mais si c'est du type T2, alors fais quelque chose sinon, "gifle-toi.

ce qui, je pense, s'applique également dans ce cas. Si vous voulez faire quelque chose en fonction du type de classe auquel l'objet référencé appartient, la structure de code suivante devrait vous aider. 

NOTE: Je ne l'ai pas compilé. 

class Parent {
    public void doSomething() {
        System.out.println("I am the Parent, and I do as I like");
    }
}

class ChildA extends Parent {
    public void doSomething() {
        System.out.println("I am a child named A, but I have my own ways, different from Parent");
    }
}

class ChildB extends Parent {
    public void doSomething() {
        System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
    }
}

public class Polymorphism101 {

    public static void main() {

        Parent p = new Parent();
        p.doSomething();

        p = new ChildA();
        p.doSomething();

        p = new ChildB();
        p.doSomething();

    }

}

EDIT: Un meilleur exemple

Vous pourriez développer une application dessin. Une application qui dessine des formes de toutes sortes. Dans ce cas, vous devriez avoir un résumé type Shape

À des fins comme dessiner toutes les formes; lister toutes les formes; rechercher une forme ou supprimer une forme, vous devez avoir une liste de formes. Comme la liste est de type parent, elle peut stocker toutes les formes.

La Shapeinterface/classe abstraite/classe virtuelle devrait avoir un abstrait/virtuel pur fonction Draw(). Ainsi, dans votre DrawToDeviceLoop, vous appelez simplement Draw() pour chaque forme, vous n'avez jamais besoin de vérifier quelle est sa forme.

L'interface Shape peut avoir un résumé implementation AbstractShape, qui peut avoir un nom de forme ou un id en tant que membres de données et GetName, Cleanup et d'autres fonctions avec des fonctionnalités communes à toutes les formes.

Rappelez-vous qu'un type abstrait ne peut pas être instancié, donc Shape lui-même ne peut pas être instancié, car il ne peut pas non plus être dessiné.

51
Ozair Kafray

instanceof retournera true s'il s'agit d'une sous-classe ...

instanceof Documentation

5
Yochai Timmer

Oui. instanceof sera vrai chaque fois que la référence (côté gauche de l'expression instanceof) peut être transtypée en ReferenceType (le type situé à droite de l'expression instanceof.). Cela sera vrai pour les sous-classes par rapport à leur parent:

Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true

From Spécification du langage Java, Java SE 9 Edition :

15.20. Opérateurs relationnels
...
RelationalExpression instance de ReferenceType

15.20.2. Opérateur de comparaison de type instanceof
...
Au moment de l'exécution, le résultat de l'opérateur instanceof est true si la valeur de RelationalExpression n'est pas null et la référence peut être convertie en ReferenceType sans générer de ClassCastException. Sinon, le résultat est false

0
Roland

ofcourse, il retourne vrai car l'enfant est une instance du parent

0
yahh