Язык и архитектура Java

         

Основные свойства языка программирования Java


Встроенные (примитивные) типы данных

В языке Java, так же как и в С++, существует набор встроенных типов данных, которые (так же как и в С++) не являются объектами. Набор их также сходен с набором базовых типов С++ за некоторыми исключениями.

Numeric

Характерным отличием от С++ является то, что бинарное представление чисел отныне фиксировано:

  • целые числа: 8-бит byte, 16-бит short, 32-бит int, 64-бит long. Все числа со знаком, ключ unsigned из языка удален.
  • числа с плавающей точкой. 32-бит float, 64-бит double. Представление должно соответствовать стандарту IEEE 754.
  • Character

    Отличаются от С++ как синтаксисом, так и представлением. Тип character есть 16-разрядное число без знака (диапазон 0-65,535). Кодировка соответствует стандарту Unicode. В силу того, что эта кодировка в идеале должна охватывать все существующие в мире языки, это представление должно облегчить локализацию приложений.

    Boolean

    Этот тип данных не выделен в С++, однако неявно присутствует практически во всех программах. В Java тип называется boolean, может принимать значения true и false и не может (в отличие от С++) быть преобразован в другой тип.

    Операторы

    Добавлен новый оператор >>> логического сдвига вправо (т.к. нет беззнаковых целых чисел). Встроенная операция слияния строк (оператор +).

    Массивы

    В отличие от С++ массивы в Java являются полноценными объектами с определенным runtime представлением. Декларация:

    Point myPoints[];

    резервирует ссылку на массив, а не место под реальный объект. Сам массив может быть затем создан выполнением

    myPoints = new Point[10];

    а его элементы заполнены операцией типа:

    myPoints[2] = new Point();

    Размер массива может быть получен во время выполнения программы:

    howMany = myPoints.length;

    Значение индекса проверяется при каждом обращении, при ошибке возбуждается исключительная ситуация.

    Указатели полностью исключены из языка вместе с целой категорией трудноуловимых ошибок "замедленного действия". К тому же наличие указателей противоречит требованиям безопасности и усложняет реализацию сборщика мусора.


    Strings

    Строки в Java являются полноценными объектами. Они делятся на текстовые константы (Strings) и модифицируемые строки (StringBuffer). Компилятор позволяет явно определять текстовые литералы в программе подобно тому, как это делается в С++

    String hello = "Hello world!";

    Ссылка hello инициируется объектом класса String на основе представления "Hello world!" в кодировке Unicode.

    Оператор "+" может быть применен к строкам, например

    System.out.println("There are" + num + "characters in the file.");

    Multi-Level Break

    В Java отсутствует выражение goto. Анализ С/С++ текстов показал, что подавляющее число случаев использования этого оператора связано с необходимостью выхода из вложенного цикла. Для отработки таких ситуаций в Java перед началом блока может ставиться метка, а инструкции break и continue также могут сопровождаться меткой, на которую должен быть осуществлен переход. Например:

    test:

    for(int i = 0; i < 10; i++)

    for(int j = 0; j < 10; j++)

    if( i > 3)

    break test;

    Управление памятью, сборка мусора

    Необходимость явно управлять памятью в С/С++ программах всегда была большой занозой для программистов. Мало того, что сами программы изобиловали вызовами функции free или операторами delete, непосредственно к логике программы отношения не имеющими. Ошибки, связанные с неосвобождением памяти или наоборот, с удалением уже однажды удаленных объектов, относятся к категории ошибок наиболее трудных для обнаружения и исправления.

    Java полностью снимает эту заботу с программиста. Автоматический сборщик мусора обязан быть встроен в run-time системы. Память объектов, на которые больше нет ссылок, в конце концов возвращается в систему. Опыт показывает, что несмотря на относительную сложность сборщиков мусора, производительность системы в целом может оказаться не меньше, а часто и больше, чем при явном освобождении памяти программой.

    Сборка мусора в фоновом режиме

    Одно из преимуществ того, что Java-приложения многопотоковые, заключается в том, что сборка мусора может производиться в фоновом потоке. Этот поток имеет меньший приоритет выполнения, чем остальные, поэтому система всегда готова ответить на действия пользователя, отсутствуют "периоды молчания", в которые производится только сборка мусора. С другой стороны, паузы в операциях пользователя сборщик мусора может использовать для своей работы, обеспечивая наличие свободной памяти в моменты, когда это необходимо.

    Встроенная синхронизация потоков

    Java поддерживает многопотоковость не только на уровне библиотек, но и на уровне самого языка, что значительно облегчает построение приложений, надежно работающих в многопотоковом режиме.


    Содержание раздела