Unterschied zwischen Dynamischen und Statischen Typ-Zuweisungen in Java
Angesichts der Folgen Klassenhierarchie, welche die dynamische und statische Typen für die folgenden Aussagen?
Klassenhierarchie:
class Alpha {}
class Beta extends Alpha {}
class Gamma extends Alpha {}
class Epsilon extends Alpha{}
class Fruit extends Gamma{}
class Golf extends Beta {}
class Orange extends Fruit{}
Für jede der folgenden Aussagen, Statische Typ? Dynamische Typ?:
Fruit f = new Fruit();
Alpha a = f;
Beta b = f;
a = b;
Gamma g = f;
Meine Antworten/Fragen
Ich verstehe, dass Fruit f = new Fruit()
werden sowohl statische und dynamische Typ-Obst.
Alpha a = f;
Typ Alpha zur compile-Zeit (statisch) und geben Sie Obst zur Laufzeit (dynamisch).
Gamma g = f;
- Typ Gamma zur compile-Zeit (statisch) und geben Sie Obst zur Laufzeit (dynamisch).
Allerdings weiß ich nicht, die anderen zwei Antworten. Beta b = f ist eine Instanz, die in die zwei Unterklassen der gleichen super-Klasse sind einander zugeordnet, also bin ich nicht sicher, ob es wäre der Typ, Beta-oder Typ Alpha zur compile-Zeit (statisch). Und a = b ist eine Zuordnung nach Deklaration so bin ich nicht sicher, was die Antwort sein würde. Jemand bitte helfen Sie mir danke!
Entweder hast du einen Tippfehler im code hast du geschrieben, oder du bist posting uncompilable code. Sollte
Gamma
erweitern Beta
statt Alpha
?Sie nur jemals schaffen, eine
Fruit
und dieser Typ ist der Typ nur zur Laufzeit, die es jemals geben wird. Es ist nicht zu ändern, es wenn geben Sie Verweise hinzufügen, um es.hochgeladen Beispiel-code ideone.com/wdk7oa Wie bereits erwähnt, nicht kompilierbare Main.java:15: Fehler: inkompatible Typen Beta b = f;
InformationsquelleAutor user3088470 | 2013-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Schreibe dies in Eile, also pls entschuldigen Sie mögliche Tippfehler (ich mache später, wenn ich eine chance bekommen).
Ich glaube du verwechselst ein wenig die Begriffe
static and dynamic
- Datentypen mit compile-time und run-time-Typen (oder, wie in C++ bei der Zuweisung der Adresse eines Objekts vom Typ A in einen Zeiger vom Typ B mit B wird die übergeordnete Klasse von A.)Sperrung Reflexion tricks, es gibt keine dynamische Typisierung in Java. Alles ist statisch typisiert zur compile-Zeit. Der Typ eines Objektes zur Laufzeit ist die gleiche wie die, die Sie bekam, zusammengestellt.
Was passiert ist, dass Sie sind verwirrend Objekt-Referenzen (a, b, c, f) mit den tatsächlichen instanziierten Objekte im heap (alles erstellt mit
new
.)In Java
f
ist eine Referenz auf ein Objekt, nicht das Objekt selbst. Außerdem, der Typ der Referenz vonf
istFruit and sub-classes of it
. Das Objekt (new Fruit()
), die Sie zuordnen, es passiert zu sein, der TypFruit
.Nun alle anderen Verweise in deinem Beispiel-code, den Typ
reference to A and sub-classes of it
; b ist vom Typreference to B and sub-classes of it
; etc, etc.Beachten Sie dies, denn es ist sehr wichtig.
einer ist der Typ "Referenz auf type-A und sub-Klassen".
f ist vom Typ "Referenz auf type-Obst-und sub-Klassen".
Dem Objekt f ist vom Typ 'Obst'. Wenn Sie sagen, 'a = f' Sie sind nicht die Zuordnung 'f' auf 'ein'. Sie werden sagen: 'jetzt wird die Referenz, die Sache f ist derzeit die Referenzierung'.
So nach, dass die Zuordnung, was ist
a
Referenzierung? Das Objekt vom TypFruit
die Objekt-Referenzf
wies auf die zur Zeit der Abtretung.Erinnern, a -, b -, g -, f -, Sie sind keine Objekte. Sie sind Referenzen oder handles zu Objekten geschaffen, die eine oder andere Weise mit der
new
Betreiber.Einer Referenz-variable wie a, b oder f sind verschiedene Tiere aus der erstellten Objekte mit
new
. Aber es ist einfach so passiert, dass der ehemalige kann zu den Punkten später.Den Typ des erstellten Objekts mit new zur Laufzeit ist die gleiche wie die ermittelt zur compile-Zeit.
Gleiche wie oben. Die variable
g
ist eine Referenz auf ein Objekt vom Typreference to type Gamma and sub-classes
. In dieser Zuordnungg
ist gemacht, um auf das gleiche Objekt zeigen wies durchf
. Was ist der Typ des Objekts? Die gleichen zur compile-Zeit: Früchte.b ist vom Typ
reference to type Beta and sub-classes of it
. Das Objekt weist nach der Zuweisungb = f
ist der TypFruit
, der Typ hatte es zur compile-Zeit.Den Typ von Objekt-Referenzen a, b, g, und f ist bestimmt zur compile-Zeit. Sie sind statisch typisiert und ändern sich nicht im run-time.
Den Typ eines Objekts erstellt mit
new
ist bestimmt auch zur compile-Zeit. Sie sind auch statisch typisiert und ändern sich nicht im run-time.Objekte, die in Sachen Objekt-Referenzen a, b, g und f zeigen Sie auf zur Laufzeit, wird festgestellt, ob die Aussagen zu finden sind gilt durch den compiler. Die Zuordnungen können sich ändern, aber das hat nichts damit zu tun, ob der Objekt-Referenzen oder das Objekt selbst sind statisch oder dynamisch typisiert.
Wenn Sie möchten, um zu sehen, eine klare Unterscheidung zwischen dynamischer und statischer Typisierung Folgendes:
Dann gibt es die Unterscheidung zwischen stark typisierte und schwach/Ente typisierte Sprachen (sowohl dynamisch typisiert ist.) Es gibt viel Literatur zu diesem Thema gibt.
Hoffe, es hilft.
sub-classes
" ? vielen Dank im Voraus.Obst ist keine Unterklasse von der Beta, also wie funktioniert b = f einen Sinn ? Wie es scheint, sollte nicht kompilieren.
InformationsquelleAutor luis.espinal
Erm, eine Erklärung nicht geben, zumindest gibt es keine solche Vorstellung, in der Java Language Specification. Die Skillung hat zwei unterschiedliche Arten von Typen: die deklarierten Typ der variable, ein Feld oder einen parameter, und die runtime-Klasse eines Objekts.
Wie der name andeutet, ist die deklarierten Typ der eine variable, ein Feld oder einen parameter ist der Typ, den Sie erwähnen es in der Erklärung. Zum Beispiel die Erklärung
Foo bar;
deklariert eine variable mit dem Namenbar
TypFoo
.Den runtime-Klasse eines Objekts ist bestimmt durch die Klasse-Instanz-oder array-creation-expression verwendet, um es zu konstruieren, und bleibt für die gesamte Lebensdauer des Objekts.
Also der code:
erklärt 3 Variablen der Typen
Integer
,Number
undObject
bzw. alle beziehen sich auf ein einzelnes Objekt mit runtime-KlasseInteger
.InformationsquelleAutor meriton
Beton -, Laufzeit-Typ von
f
ist Obst (wie du richtig angegeben, die in Ihrer Frage).So
Beta b = f;
initilalizes eine variable, deren erklärte, compile-Zeit-Typ ist Beta, und deren Laufzeit-Typ-Obst. Dieser Code wird nicht kompiliert, wenn, weil der compile-Zeit-Typ vonf
ist Obst und Obst ist keine Unterklasse von der Beta, sof
können nicht zugewiesen werden, um eine variable des Typs Beta.In
a = b;
,b
, deren runtime-Typ-Obst (siehe oben) wird der Variablen zugewiesena
, erklärt, wieAlpha a
. Soa
's compile-Zeit-Typ ist Alpha und seinen Laufzeit-Typ-Obst.Fruit
nicht ableiten ausBeta
, soBeta b = f;
nicht kompilierenja, in der Tat. Ich bearbeitet meine Antwort.
InformationsquelleAutor JB Nizet
Zunächst zu klären, "Referenzvariablen" Typ:
Punkte, um nichts und die Referenz-Variable obj würde KEINE geben.
Jetzt
obj zeigt auf eine Zeichenkette, und die Referenz-Variable obj Typ String hat.
Den Punkt, ist Java eine statisch typisierte Sprache, und alle reference-type-Variablen ein Datentyp zugewiesen werden zur compile-Zeit. Die Referenz-variable obj Punkt zu einem anderen Objekt, solange es ist eine Unterklasse von Object. In diesem Fall
fast alles. Betrachten
Zur Laufzeit, ebenso wie die Kompilierzeit, die Referenz-variable obj vom Typ Byte.
Des statischen/dynamischen Typs eines Objekts, für mich, zu tun hat mit Vererbung.
Insbesondere die übergeordneten Mechanismus. Auch bekannt als Dynamische Polymorphie
und die Späte Bindung.
Betrachten Sie das überschreiben der equals() in Klasse Object:
Nun wissen wir, dass der Typ der Referenz-Variablen-typ ist Arten.
Wenn es um
Dies ist, wie ich denke, der compiler denkt.
Wenn die equals() ist
1.NICHT statisch und endgültig, was es ist.
2.Verwiesen wird, die von einer Basisklasse (mehr dazu bald).
dann der compiler verschiebt die Methode die aufgerufen wird, um den JVM. Die genaue Methode, die aufgerufen wird, hängt von der Dynamische Typ(bald mehr) der variable, der die Methode aufruft. In unserem Fall die Referenz-variable typ.
Dies ist bekannt als Dynamic Method Invocation.
Nun Verwiesen wird, die von einer Basisklasse:
Aus dem obigen code
Art Objekt betrachtet werden könnte als der Basis-Typ, der typ, auch bekannt als die Statischen Typ einer Referenz-Variablen und die equals() verwiesen wird, wird von der Basis-Typ, in diesem Fall Objekt.
hätten wir
Gäbe es keine Referenz von einem Basis-Typ und somit kein Dynamic Method Invocation.
Nun zu den Dynamische Typ einer Referenz-variable.
Den Dynamische Typ der typ ist Typen und nach Dynamic Method Invocation, die equals() in Klasse-Typen würde zur Laufzeit aufgerufen werden.
Können auch sagen, wir hatten eine Klasse, die erweitert die Arten, TypesSubClass.
Und TypesSubClass hatte auch einen überschriebenen equals(). Dann
Machen würde, die Dynamische Typ der typ TypesSubClass und TypesSubClass ist
equals() würde zur Laufzeit aufgerufen werden.
Um ehrlich zu sein, ich persönlich wusste nicht, warum, wir brauchten alle dieses und gebucht haben Sie eine Frage bezüglich dieser. überprüfen Sie
Was ist der Grund hinter der Dynamischen Methode Auflösung in einem staticlly typisierte Sprache wie Java
InformationsquelleAutor Clive Ferreira
Sollten Sie einen Blick auf diese Artikel: http://www.sitepoint.com/typing-versus-dynamic-typing/
Statische Typisierung ist es, wenn eine Sprache nicht erforderlich, die Variablen initialisiert werden.
zB.
Dynamische Typisierung ist, wenn eine Sprache benötigt die variable initialisiert werden.
zB.
Java ist eine statische Sprache. So in einer dynamischen Sprache, die Sie können einfach sagen
num = 10
im Gegensatz zu einer statischen Sprache, wo Sie zu sagen habenint num; num = 10
Aber die Tatsache, dass man nur sagenint num;
und geben Sie ihm den Wert später macht es statisch. Denken Sie an es auf diese Weise... wenn Sie sagenint num;
Ihr Programm setzt eine bestimmte Stelle im Speicher und bezeichnet, die als variablenum
so jetzt, wenn Sie einen Wert zuweisennum
es wird immer in diesem Raum der Speicher reserviert wurde. Daher statischeIch denke du meinst zu sagen, dass eine statische Typ-system erfordert ein Typ angegeben werden, für jede variable in der Deklaration. Das ist nicht ganz wahr. Eine statische Typ-system erfordert, dass jede variable eine Art, wie der compiler bestimmt, der Typ ist irrelevant. Insbesondere, C# gilt als eine statisch typisierte Sprache, obwohl Sie können den compiler
var
Schlüsselwort.InformationsquelleAutor Adjit