После ответа Хловдала я снова процитирую Бенджамина Пирса с чем-то положительным в этом вопросе.Я ссылаюсь на главу 1 «Типы и языки программирования» и расширяю ее.
Java - это безопасный язык (т. Е. Предотвращаются ошибки типа во время выполнения), в основном static проверки типов.Однако из-за наследования (точнее, подтипирования) тип переменной может быть более общим, чем тип указанного значения.Кроме того, язык также позволяет проверять, имеет ли объект определенный тип, и понижать объекты во время выполнения - во время таких операций типы проверяются во время выполнения.Поэтому каждый объект имеет указатель на представление своего типа во время выполнения.
C - это небезопасные языки со статической проверкой типов.Типы не существуют во время выполнения.C ++ все еще является небезопасным языком со статической проверкой типов, но он также имеет ограниченную идентификацию типов во время выполнения для классов, удовлетворяющих определенному условию - то есть, имеющих некоторый виртуальный метод (как и все объекты в Java).
Редактировать : "статическая типизация" - это , а не четко определенная концепция.Чтобы показать это, я (в общих чертах) определю три свойства, которые могут относиться к «статической типизации».
- Перед выполнением программы она проверяется на тип: и Java, C и C ++ удовлетворяют этомукритерий.
- Если тип программы проверяется, мы можем гарантировать, что во время выполнения не будет ошибок определенного класса: C и C ++ не пройдут этот критерий, Java пройдет его (хотя это возможно только из-за неудачного приведения типов).специально исключены из этого класса ошибок).
- Во время выполнения не существует представления типа, определенного языком.Это свойство не подходит как для Java, так и для C ++ и характеризует такие языки, как C и Pascal.
Если вы говорите, что язык «статически типизирован», если он имеет все три свойства, которые я упомянул выше, то ни Java, C или C ++ статически типизированы.