Nach der Antwort von hlovdal möchte ich noch einmal Benjamin Pierce zitieren, der sich positiv zu dieser Frage geäußert hat. Ich beziehe mich auf Kapitel 1 seines Buches "Types and Programming Languages" und erweitere es.
Java ist eine sicher Sprache (d.h. Laufzeit-Typfehler werden verhindert) mit meist statisch Typprüfung. Aufgrund der Vererbung (genauer gesagt der Subtypisierung) kann der Typ einer Variablen jedoch allgemeiner sein als der Typ des angezeigten Wertes. Darüber hinaus ermöglicht die Sprache auch die Überprüfung, ob ein Objekt einen bestimmten Typ hat, und das Downcasting von Objekten zur Laufzeit - bei solchen Operationen werden die Typen zur Laufzeit überprüft. Daher hat jedes Objekt einen Zeiger auf eine Laufzeitrepräsentation seines Typs.
C ist eine unsichere Sprache mit statischer Typprüfung. Typen gibt es zur Laufzeit nicht. C++ ist immer noch eine unsichere Sprache mit statischer Typprüfung, bietet aber auch eine eingeschränkte Typidentifikation zur Laufzeit für Klassen, die bestimmte Bedingungen erfüllen, d.h. über eine virtuelle Methode verfügen (wie alle Objekte in Java).
Editar : Die "statische Typisierung" ist eine no ein klar definiertes Konzept. Um das zu zeigen, werde ich (grob) drei Eigenschaften definieren, die man mit "statischer Typisierung" in Verbindung bringen könnte.
- Bevor das Programm ausgeführt wird, wird es auf seinen Typ geprüft: Sowohl Java als auch C und C++ erfüllen dieses Kriterium.
- Wenn das Programm typgeprüft ist, können wir ihm garantieren, dass es zur Laufzeit keine Fehler einer bestimmten Klasse hat: C und C++ erfüllen dieses Kriterium nicht, Java erfüllt es (obwohl dies nur möglich ist, weil fehlgeschlagene Casts ausdrücklich von dieser Fehlerklasse ausgeschlossen sind).
- Zur Laufzeit existiert keine sprachdefinierte Typdarstellung. Diese Eigenschaft trifft sowohl auf Java als auch auf C++ zu und kennzeichnet Sprachen wie C und Pascal.
Wenn man sagt, dass eine Sprache "statisch typisiert" ist, wenn sie alle drei oben genannten Eigenschaften hat, dann ist weder Java, C noch C++ statisch typisiert.