Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 [ 81 ] 82



ПРИЛОЖЕНИЕ

Java против C++

При виде ажиотажа, поднятого вокруг Java, невольно возникает вопрос: а не является ли это обычной рекламной шумихой, единственная цель которой - заставить вас купить очередной язык, обновить компьютер и приобрести кучу книг? Верятно, вам приходилось видеть, как обозреватели в вашем любимом компьютерном журнале называют Java «новой версией» С++. Если это действительно так, то стоит ли вам, знатоку С++, беспокоиться об этом «новом» языке?

Java - это просто диалект С++. Кое-кто называет Java «вычищенным» вариантом С++, из которого убраны некоторые редко используемые и нелогичные возможности. Выходит, вы почти что знаете Java, не открыв ни одной книги. Тем не менее, у Java есть определенные аспекты, способные поколебать вашу уверенность. В этом приложении рассматриваются некоторые отличия между языками.

Забудьте о ручном управлении памятью, благодаря которому на С++ можно писать приложения, превосходящие Java-аналоги по быстродействию и более эффективно расходующие память. Разработчики Java ликвидировали ручное выделение и освобождение памяти (пример 1 ), стремясь снизить вероятность ошибок при кодировании.

Пример 1

int* pt = new int; delete pt;

Арифметические операции с указателями в Java отсутствуют (см. пример 2). Массивы Java представляют собой настоящие массивы, а не указатели, как в С++. Используемая в Java модель указателей фактически ликвидирует синтаксис указателей С++. Изменения были внесены для предотвращения случайных нарушений памяти и порчи данных из-за ошибочных смещений в арифметических операциях с указателями.

Пример 2

char* na = "Bob Smith" na++;

Java предотвращает утечки памяти за счет ее автоматического освобождения - своего рода автоматическая сборка мусора.

Кроме того, размер встроенных типов данных в Java не зависит от компилятора или типа компьютера, как в С++. Типы данных имеют фиксированный размер - скажем, int в Java всегда является 32-разрядным числом (табл. 1 ). Компилятор Java генерирует инструкции байт-кода, которые эффективно преобразуются в набор машинных команд.



Таблица 1. Типы данных Java

Размер

4 байта

short

2 байта

long

8 байт

float

4 байта

double

8 байт

Кроме того, вы не встретите еще некоторых знакомых конструкций. Разработчики Java ликвидировали еще две конструкции, связанные с управлением памятью - структуры (см. пример 3) и объединения. Java не поддерживает этих синтаксических средств С++.

Пример 3

struct name {

char fname[20]; char 1name[30];

Одна из задач Java заключалась в том, чтобы предотвратить динамические ошибки за счет ликвидации источника распространенных ошибок в С++. Среди таких ошибок - оператор присваивания (=), перепутанный с оператором равенства (==). В примере 4 показана распространенная ошибка С++, предотвращаемая компилятором Java.

Пример 4

if (value = 10)

Вы провели бесчисленные часы за разработкой изощренной иерархии множественного наследования и теперь желаете перенести ее в Java? Вас ждет некоторое разочарование. Принципиальное отличие между Java и С++ заключается в том, что Java не поддерживает множественного наследования из-за сложностей в управлении иерархиями. Тем не менее, в Java существуют интерфейсы, которые обладают преимуществами множественного наследования без тех затруднений, которые с ним связаны.

Остерегайтесь коварства Java! Этот язык полон ловушек для программистов на С++. Например классы Java похожи на С++. Тем не менее, все функции в Java (в том числе и main) должны принадлежать некоторому классу. В соответствии с требованиями Java для main необходимо создать класс-оболочку (см. пример 5). В Java нет функций классов, а есть методы, поэтому main - метод, а не функция

Пример 5

public class ShellClass

public static void main(Strings[] args)

Работа со строками в Java несколько запутанна. В С++ строка представляет собой массив символов, и вы можете модифицировать отдельные символы в строке. В Java дело обстоит иначе. Строки Java больше напоминают указатель char*. Строковые объекты Java удобны для программистов, поскольку они автоматически выделяют и освобождают память. Это происходит в операторе присваивания, в конструкторе и деструкторе.

Методы Java похожи на функции классов С++, но все же не идентичны им. Например, в Java нет глобальных функций и прототипов функций. Компилятор Java работает в несколько проходов, что



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 [ 81 ] 82