2017-08-13 5 views
1

par exemple pour la sécurité des données Je crée une classe par exemple ModelClass et défini quelques propriétés et méthodes et de définir une liste comme private List<ModelClass> results; alors comment java saura que ce que je passe est vraiment ModelClass, compare-t-il toutes les méthodes et propriétés de ModelClass et quel objet je passe dans les résultats, comment java détermine-t-il que 2 objets sont de même type compare-t-il tous les champs et méthodes pour savoir que oui même type,Comment java reconnaît que les deux objets sont du même type

Oui, je sais que lorsque je définis leur type de même type auraient même des objets sont méthode, mais ce qui se passe quand on passe l'objet comme des objets polymorphes

J'ai eu ce sentiment d'ici quand je retrofit appris, en rénovation quand nous la réponse est comme:

public void onResponse(Call<MoviesResponse>call, Response<MoviesResponse> response) { 
      List<Movie> movies = response.body().getResults(); 
      Log.d(TAG, "Number of movies received: " + movies.size()); 
     } 

le MovieResponse a le même nom de champ qui retournent un objet réponse here

+0

Vous décrivez "dactylographie". Java utilise le typage statique. L'objet sait de quelle classe il s'agit, et les super-types de la classe jusqu'à Object, et le type nécessaire doit être l'un de ceux-ci ou une interface implémentée. –

Répondre

0

Chaque objet a un dossier de quelle classe exactement, que vous pouvez voir en appelant la méthode getClass() sur ledit objet. Cela inclut le nom complet de la classe (y compris le paquet), ainsi que des informations sur les champs, méthodes, superclasses, interfaces, etc.

Dans votre cas, tout ce qu'il fait est de comparer ces objets Class pour être sûr ils sont compatibles.

+0

qu'en est-il si je définis la classe A et que j'ai défini certains champs comme le nom, l'âge, la nationalité et créé son objet et ensuite lui assigner un objet autre que les mêmes champs, nom, âge, nationalité copier en classe A objet? – blackHawk

+0

mis à jour ma question – blackHawk

+0

Ce que vous venez de décrire ne compilera pas. Juste parce qu'il a les mêmes champs qu'un 'A', les mêmes méthodes qu'un' A', ne font pas nécessairement un 'A'. Et Java rejettera une telle tentative au moment de la compilation. –

-1

Je pense, lorsque vous ajoutez un objet dans la liste < ModelClass>résultats, la première action est une vérification du type comme if(object instanceof ModelClass){...}

+0

mis à jour ma question – blackHawk

+0

Non ce n'est pas. Il y a une vérification à la compilation. – EJP

0

Le composant qui fait le plus de vérification de type est le compilateur Java, et a le code source complet à sa disposition, donc il peut simplement vérifier quelles variables de type ont été déclarées avoir. (Pour certaines bibliothèques, vous ne pouvez pas avoir le code source, mais aussi les fichiers de classe contiennent ces informations de type.)

Par exemple, dans l'extrait de code

public void add(ModelClass a) { 
    results.add(a); 
} 

le compilateur sait que results est une référence à List<ModelClass> et que a est une référence à un ModelClass, parce que c'est ainsi qu'ils sont définis dans le code source. Donc, il accepte ce code comme valide. Lors de l'exécution, aucune vérification de type ne doit être effectuée dans ce cas.

Dans certains cas, notamment lorsque vous utilisez l'opérateur instanceof ou une distribution explicite, la JVM doit effectuer une vérification de type lors de l'exécution. Pour cela, chaque objet Java connaît sa propre classe. Vous pouvez obtenir la classe d'un objet en appelant sa méthode getClass().

Notez que le compilateur vérifie le type défini des variables, alors qu'à l'exécution le type de l'objet est vérifié (ce que le compilateur ne peut pas savoir). Ce dernier est toujours un sous-type de l'ancien. De plus, pour des raisons historiques, les informations de type générique à l'exécution sont perdues. Donc results.getClass() renverra ArrayList.class (ou une autre implémentation List), pas List<ModelClass>.class (ou quelque chose comme ça).

0

Pour comprendre ce processus, vous devez savoir deux choses: comment obtenir une information de classe d'objet donné et comment comparer deux de ces éléments.

Alors, comment Java connaît-il réellement la classe d'objets?

Lors de l'exécution, les classes sont les mêmes objets que tout le reste. Chaque objet commun stocke une référence à l'objet de classe. Et chaque classe stocke une référence à sa superclasse.

Pour stocker un objet dansList<Movie>le type d'objet doit être directement Movie ou il est peut être son successeur. Ayant deux classes comment dites-vous si l'un est le même ou au moins un successeur d'un autre?

Opérateur instanceof, c'est comme ça!

final Movie a = new Movie(...); 
final String b = "Not a Movie"; 

a instanceof Movie; // expression is true 
b instanceof Movie; // false 

Disons que vous avez des classes hiérarchie

Object (0) ->Video (1) ->Movie (2) ->HollywoodMovie (3)

et le code

final HollywoodMovie a = new HollywoodMovie(...); 
a instanceof Video; // true, how it works? 

La ligne instanceof de la deuxième ligne procédera comme suit:

  1. vérifie si le type de a a au moins deux noeuds à la hiérarchie des classes (car Video est le deuxième dans sa propre hiérarchie)
  2. Si précédente est vrai vérifie si le deuxième noeud est Video

Ceci est un approximation de instanceof travail