2017-10-06 50 views
-1
class A {} 
class B extends A{} 

A objectX = new B(); 

Que signifie la dernière ligne? Est-ce un objet de classe A ou est-ce un objet de classe B.Je suis confus au sujet du polymorphisme et de l'objet de la classe

L'instance et l'objet ont-ils la même signification? Est-ce que l'instance objectX de A ou est-ce une instance de B?

Lorsque nous exécutons objectX.SomeMethod. Que va vérifier le compilateur? Ou méthode sera vérifiée lors de l'exécution?

class A{} 
    class B extends A{} 
    public class Main{ 
    public static void main(String[] args){ 
    A objectX = new B(); 
    System.out.println(objectX instanceof B);//line 1 
    System.out.println(objectX instanceof A);//line 2 
    } 
    } 

Si je lance le code ci-dessus pourquoi est-il me donne vrai pour la ligne 1 et la ligne 2.objectX pointe vers b.Comment venir ObjectX est une instance de A.?

+2

C'est une référence de type A, se référant à un objet de type B. Cela signifie que vous ne pouvez appeler que des méthodes et vous référer aux champs définis dans la classe A. –

+3

C'est beaucoup plus facile si vous montrez votre question dans le code, plutôt que d'essayer de le décrire en mots. –

+0

Visitez: https://stackoverflow.com/questions/13077009/java-difference-between-ax-new-a-and-ax-new-b-when-b-extends-a –

Répondre

1

Vérifiez cet exemple:

Object aStringObject=new String(); 

Dans votre scénario A est l'objet (super classe de tous les objets) et B est une chaîne. Donc, pour votre question, aStringObject est une référence (ou un pointeur) à un objet d'une classe String. Il est défini comme une référence avec un objet Object afin qu'il puisse pointer vers différents types d'objets et pas seulement vers des chaînes. Donc, si vous voulez éviter les erreurs de compilation dans votre code, vous pouvez l'utiliser uniquement comme un objet. Si vous savez qu'il s'agit d'une chaîne (l'occurrence que vous pointez est de type String), vous pouvez la convertir en chaîne et tout ira bien. Dans l'exemple ci-dessus, vous pouvez le faire:

String aStringString = (String) aStringObject; 

mais si cet objet est pas quelque chose que vous venez de déclarer que vous ne pouvez pas être sûr que vous pouvez le faire et par sa déclaration, il peut être une chaîne, mais il peut aussi ne pas être un.

Dans votre cas:

A objectX = new B(); 

ObjectX est une instance de type B, mais la référence (pointeur) est déclarée avec un type A et vous pouvez l'utiliser en toute sécurité (sans coulée) comme un type Un objet et cela fonctionnera parce que tous les objets de type B sont aussi A :) Et vous pouvez faire ((B) objectX) .bMethod() parce que vous savez que c'est en réalité B mais ce n'est pas sûr car cela peut être un A déclaré comme ça.

+0

vous n'auriez jamais besoin de lancer objectX à un "A" de toute façon - Ce n'est pas que vous pouvez l'utiliser en toute sécurité comme un A, c'est un A – pecks

+0

ouais c'est ce que je veux dire. Vous le déclarez comme un A et c'est un A puisque B est un A. Mais si vous voulez l'utiliser comme un B, vous devez le lancer. Et vous ne pouvez pas le faire en toute sécurité, car la définition ne garantit pas que cet objetX est un B (vous pouvez le savoir parce que vous avez créé l'instance). Je ai écrit (sans coulée) juste pour plus de clarté, mais je suppose que cela ne le rend pas plus clair :) Je me suis trompé dans l'explication –

+0

vous pouvez bien sûr vérifier si c'est un B en utilisant instanceof – pecks

0
A objectX = new B(); 

ici ObjectX est la référence de classe A (classe parente), qui peut contenir de l'objet soit de classe A ou B (classe enfant).

et le côté droit de = i.e nouveau B(), est l'objet de la classe B (classe enfant).

Rappelez-vous toujours que les objets Java sont créés en utilisant un nouveau mot-clé. la partie de gauche est la référence et la partie de droite est l'objet.

lorsque vous appelez la méthode comme celui-ci

objectX.someMethod() 

dans ce cas, la première méthode de vérification du compilateur est présent dans la classe de référence (classe A) ou not.If pas présent montrent alors l'erreur.

Si la méthode est trouvée, alors la méthode sera appelée depuis la classe enfant (classe B) .parce que la liaison de la méthode est effectuée au moment de l'exécution.