2017-08-13 4 views
1

zum Beispiel für die Datensicherheit Ich erstelle eine Klasse zB ModelClass und definierte einige Eigenschaften und Methoden und definieren einige Liste wie private List<ModelClass> results; dann, wie Java wird wissen, dass was ich passiere wirklich ModelClass, vergleicht es alle Methoden und Eigenschaften von ModelClass und welches Objekt übergebe ich Ergebnisse, bin ich, wie Java feststellen, dass 2 Objekte vom gleichen Typ sind, vergleicht es alle Felder und Methoden zu wissen, dass ja sie sind gleiche Art,Wie Java erkennt, dass beide Objekte vom gleichen Typ sind

Ja, ich weiß, dass, wenn ich Typen definiere sie vom gleichen Typ sind, haben würden gleiche Objekte Methode, aber was passiert, wenn wir Objekt als polymorphe Objekte passieren

bekam ich das Gefühl, von hier, als ich Retrofit lernte, in der Nachrüstung, wenn wir Antwort wie seine erhalten:

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

die MovieResponse hat Namen gleichen Feld, das Antwortobjekt Rückkehr here

+0

Sie beschreiben "Ente Typisierung". Java verwendet statische Typisierung. Das Objekt weiß, um welche Klasse es sich handelt, und die Supertypen der Klasse bis zum Objekt, und der benötigte Typ muss einer dieser oder einer implementierten Schnittstelle sein. –

Antwort

0

Jedes Objekt einen Datensatz genau welche Klasse es ist, die Sie sehen können, indem Sie die getClass() Methode auf dem genannten Objekt aufrufen. Dazu gehören der vollständige Name der Klasse (einschließlich des Pakets) sowie Informationen über die Felder, Methoden, Oberklassen, Schnittstellen usw.

In Ihrem Fall ist alles, was Sie wirklich tun, diese Class Objekte zu vergleichen, um sicherzustellen, dass Sie sind kompatibel.

+0

Was ist, wenn ich Klasse A definieren und in dem ich einige Felder wie Name, Alter, Nationalität definiert habe und sein Objekt erstellt habe und dann ein Objekt anderen, das die gleichen Felder hat, Name, Alter, Nationalität Kopie zu Klasse A zuweisen Objekt? – blackHawk

+0

meine Frage aktualisiert – blackHawk

+0

Was Sie gerade beschrieben haben, wird nicht kompilieren. Nur weil es dieselben Felder wie ein 'A' hat, die gleichen Methoden wie ein' A', macht es nicht unbedingt ein 'A'. Und Java wird einen solchen Versuch zur Kompilierzeit ablehnen. –

-1

Ich denke, wenn Sie ein Objekt in Liste hinzufügen < ModelClass>Ergebnisse, die erste Aktion ist wie if(object instanceof ModelClass){...}

+0

meine Frage aktualisiert – blackHawk

+0

Nein ist es nicht. Es gibt eine Kompilierzeitprüfung. – EJP

0

Die Komponente Überprüfung eingeben, funktioniert die meisten Typprüfung der Java-Compiler ist, und es hat den vollständigen Quellcode zur Verfügung, so dass einfach überprüft werden kann, welche Typvariablen deklariert wurden. (Für einige Bibliotheken, die Sie möglicherweise nicht den Quellcode haben, sondern auch die Klassendateien enthalten diese Art Informationen.)

Zum Beispiel im Code-Schnipsel

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

der Compiler weiß, dass results ist ein Verweis auf List<ModelClass> und a ist eine Referenz auf eine ModelClass, denn so sind sie im Quellcode definiert. Also akzeptiert es diesen Code als gültig. Zur Laufzeit muss in diesem Fall keine Typprüfung durchgeführt werden.

In einigen Fällen, insbesondere wenn Sie den Operator instanceof oder eine explizite Umwandlung verwenden, muss die JVM zur Laufzeit eine Typprüfung durchführen. Zu diesem Zweck kennt jedes Java-Objekt seine eigene Klasse. Sie können die Klasse eines Objekts abrufen, indem Sie die Methode getClass() aufrufen.

Beachten Sie, dass der Compiler den definierten Typ der Variablen überprüft, während zur Laufzeit der Typ des Objekts überprüft wird (was der Compiler nicht wissen kann). Letzteres ist immer ein Untertyp des ersteren. Aus historischen Gründen gehen zur Laufzeit allgemeine Informationen verloren. So results.getClass() wird ArrayList.class (oder eine andere List Implementierung), nicht List<ModelClass>.class (oder so ähnlich) zurückgeben.

0

Um diesen Prozess zu verstehen, müssen Sie zwei Dinge wissen: wie man eine Klasseninformation des gegebenen Gegenstandes erhält und wie man zwei Stücke von diesen vergleicht.

Also wie Java eigentlich die Objektklasse kennt?

Zur Laufzeit sind Klassen die gleichen Objekte wie alles andere. Jedes allgemeine Objekt speichert einen Verweis auf das Klassenobjekt. Und jede Klasse speichert einen Verweis auf die Superklasse.

Um ein Objekt zu speichern, inList<Movie>der Objekttyp direkt Movie sein sollte, oder es kann sein, es Nachfolger ist. Mit zwei Klassen wie sagt man, wenn man gleich oder zumindest ein Nachfolger eines anderen ist?

Operator instanceof, das ist wie!

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

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

Angenommen, Sie haben Klassen-Hierarchie

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

Und Code

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

Die zweite Zeile instanceof führt folgende Schritte aus:

  1. Prüft, ob Art von a mindestens zwei Knoten an Klassenhierarchie hat (weil Video zweiten in seine eigene Hierarchie)
  2. Wenn vorherigen gilt prüft, ob der zweite Knoten Video

Dies ist ein Approximation von instanceof Arbeit

Verwandte Themen