Одно дело — создать язык, который мешает вам «выстрелить себе в ногу», и совсем другое — создать язык, который помешает кому-то другому «выстрелить вам в ногу».
Интерфейс (аналог абстрактного класса в C++) задает логику работы объекта, но не определяет его реализацию.
Различия между языками сравнивались с различиями между моделями автомобилей3. Языки со статической типизацией (такие, как C++) напоминают спортивный автомобиль: достаточно быстрый и безопасный, но практичный только в том случае, если вы едете по хорошей асфальтированной дороге. Языки с ярко выраженной динамической типизацией (такие, как Smalltalk) больше напоминают внедорожники: они предоставляют больше свободы, но иногда ими трудно управлять. На них веселее (а иногда и быстрее) проехать напрямую по перелеску, но там можно застрять в канаве или попасть в лапы медведям.
Цифровые подписи в сочетании с сертификатами — это средства для проверки того, что данные действительно поступили из указанного источника и их никто не подменил по пути. Если банк снабжает своей цифровой подписью свое приложение «Чековая книжка», то вы можете убедиться в том, что приложение действительно получено от этого банка (а не от какого-то самозванца) и попало к вам в неизмененном виде.
Второй уровень безопасности Java — это загрузчик классов. Он отвечает за передачу байт-кода классов Java интерпретатору. Каждое приложение, которое загружает классы из сети, должно использовать для этого загрузчик классов.
Первая линия защиты Java — верификатор байт-кода. Верификатор читает байт-код перед его выполнением и убеждается, что тот ведет себя правильно и соблюдает основные правила спецификации байт-кода Java.
Совокупность всей информации о типах в любой конкретный момент называется состоянием типов стека; именно его Java анализирует перед запуском приложения. Java ничего не знает о фактических значениях, хранящихся в стеке и в переменных; известны только их типы. Однако этой информации достаточно для соблюдения правил безопасности и для уверенности в том, что с объектами не будут выполняться некорректные операции.
виртуальная машина Java может работать в любом из двух режимов: клиентском или серверном. Режим определяет, чему будет отдано предпочтение — скорости запуска и экономии памяти или общему быстродействию. В Java 9 также можно воспользоваться опережающей (Ahead-of-Time, AOT) компиляцией, если минимизация времени запуска вашего приложения действительно важна.
Виртуальная машина (VM) Java — это программа, которая реализует исполнительную систему (интерпретатор) Java и выполняет Java-приложения. Это может быть автономная программа (например, команда java из JDK) или код, встроенный в другое приложение, такое как браузер.
Второй уровень безопасности Java — это загрузчик классов.