Автор работы: Пользователь скрыл имя, 06 Августа 2013 в 10:21, реферат
Казалось бы, на сегодняшний день изобретены уже все языки программирования, какие только можно придумать. Но нет - появился еще один, с названием Java. Этот язык сумел получить весьма заметную известность за последние несколько лет, так как он ориентирован на самую популярную компьютерную среду - сеть Internet и серверы Web.
Персональные компьютеры сделали информационные технологии частью массовой культуры. Тем не менее, уже довольно длительная история развития персональных компьютеров не знала ничего, подобного феномену Java. Что изменилось в мире в последние годы, почему этот феномен стал возможен?
Введение 3
История создания языка Java 6
Основные особенности языка Java 7
Сравнение Java и C++. 13
Список литературы 30
Однако это преимущество Java является также ее недостатком. Разобраться в огромном API программисту становится все сложнее. Можете быть наверняка уверены, что для любой задачи всегда найдется уже готовое решение или, по крайней мере, решение, облегчающее выполнение этой задачи. Но найти пригодный для этого пакет и класс становится все труднее. Также с увеличением числа пакетов стремительно растет размер Java-платформы. В результате стали возникать ее "урезанные" версии, утратившие преимущества готовых решений.
Если преимущества
Java заключаются в доступных
Самым важным инструментом для любого разработчика, использующего компилируемые языки, является компилятор. Основным достоинством компиляторов C++ является скорость работы. Для обеспечения кросс-платформенности своих компиляторов (и других средств разработки) производители Java-инструментов часто сами используют Java, со всеми вытекающими отсюда проблемами производительности и эффективности использования памяти. Иногда встречаются Java-компиляторы, написанные на C/C++ (например, IBM Jikes), но это редкость.
5. Семантика
Комментарии
С++ поддерживает как комментарии в стиле C (/* это комментарий */), так и однострочные (// вся оставшаяся часть строки является комментарием).
В Java это также работает.
Типы
В C++/Java доступны следующие встроенные типы:
C++ |
Java | |
Символьные |
char, wchar_t |
char |
Целочисленные знаковые |
signed char, short int, int, long int |
int, long, short, byte |
Целочисленные беззнаковые |
unsigned char, unsigned short int, unsigned int, unsigned long int |
|
С плавающей точкой |
float, double, long double |
float, double |
Логический |
bool |
boolean |
Дублирование ссылок и клонирование
Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать
Foofoo, bar;
bar = foo;
то произойдет копирование адреса из переменной foo в переменную bar. То есть foo и bar будут указывать на одну и ту же область памяти, то есть на один и тот же объект, В С++ это также работает.
Обработка исключений
Основная идея
обработки исключений - упростить
код обработки ошибок в программе,
предоставив стандартный
c++ использует ключевое слово throw для генерации исключения, try для отметки охраняемого блока и catch для записи кода обработки исключения. Исключения - объекты специального класса, которые могут образовывать некоторую иерархию во всех трёх языках. c++ выполняет опустошение стека, удаление всех объектов (и вызов деструкторов) для всех объектов в стеке.
В Java использует ключевые слова c++, но ведёт себя как objectpascal, включая дополнительное ключевое слово finally. Присутствие алгоритма сборки мусора ограничивает использование finally в классе, который распределяет другие ресурсы, кроме памяти. Также java строже требует, чтобы все функции, которые могут вызвать исключение, описывали в соответствующем блоке, какие исключения могут быть вызваны функцией. Эти описания исключений проверяются компилятором, что является хорошим свойством, даже если оно подразумевает некоторую дополнительную работу для программиста. В классах java объекты-исключения должны наследовать классу throwable.
6.Объектно-ориентированное программирование
Классы, объекты и ссылки
Так как мы обсуждаем языки ООП, то после этого введения, начнём обсуждать классы и объекты. Я надеюсь, что каждый ясно понимает разницу между этими двумя терминами. В двух словах, класс - это тип данных, а объект - экземпляр типа класс. Как нам теперь использовать объекты в языках, использующих различные объектные модели?
В С++, если у нас есть класс myclass с методом mymethod, мы можем написать:
myclassobj;
obj.mymethod();
и получить объект класса myclass с именем obj. Память для этого объекта обычно выделяется в стеке, и вы можете сразу начать использовать объект, как это сделано во второй строке. Вjava подобная инструкция выделяет только место для хэндла объекта, а не для самого объекта:
myclassobj;
obj = new myclass();
obj.mymethod();
Прежде чем использовать объект, вы должны вызвать "new" для выделения под него памяти. Конечно, вы можете объявить и проинициализировать объект в одном предложении, избегая использования неинициализированных объектных хэндлов:
myclassobj = newmyclass();
obj.mymethod();
Мусорная корзина
Если вы создали и использовали объект, вам нужно уничтожить его, чтобы не занимать неиспользуемую память.
В c++ уничтожить объект, расположенный в стеке, довольно просто. С другой стороны, уничтожение объектов, созданных динамически, зачастую является сложной проблемой. Есть много решений, включая подсчет ссылок и "интеллектуальные" указатели, но ни один из них не даёт простого решения. Первое впечатление для c++ программистов, что использование ссылочно-объектной модели сделает ситуацию только хуже.
Это, конечно, не касается java, так как виртуальная машина запускает алгоритм сборки мусора (в фоновом процессе, согласно теории java; или начинает этот процесс после того, как ненадолго остановит программу, как в большинстве реальных jvm). Сбор мусора предоставляется программистам бесплатно, но он может неблагоприятно влиять на эффективность выполнения приложения. Отсутствие явно записываемых деструкторов может приводить к ошибкам в завершающем коде.
Определение новых классов
Класс - это просто набор методов, работающих с определёнными локальными данными.
Вот c++ синтаксис определения простого класса:
class date
{
private:
intdd;
int mm;
intyy;
public:
voidinit (int d, int m, int y);
int day ();
int month ();
int year ();
};
А вот определение одного из методов:
void date::init (int d, int m, int y)
{
dd = d;
mm = m;
yy = y;
}
Синтаксис java очень похож на синтаксис c++:
class date
{
int dd = 1;
int mm = 1;
int yy = 1;
public void init (int d, int m, int y) {
dd = d; mm = m; yy = y;}
public int day () {return dd;}
public int month () {return mm;}
public int year () {return yy;}
}
Вышеупомянутый класс ужасно прост. Первое, что мы могли бы к нему добавить, это конструктор, что является хорошей техникой для решения проблемы инициализации объекта.
В c++, так же, как и в java, имя конструктора совпадает с именем класса. Если вы не определили никакого конструктора, компилятор синтезирует конструктор по умолчанию, добавляя его к классу. В обоих этих языках вы можете завести несколько конструкторов благодаря перегрузке функций. В Java всё работает как в c++, хотя конструкторы называются также инициализаторами. Это подчеркивает тот факт, что объект создаёт виртуальная машина java, тогда как код, который вы пишете в конструкторе, просто инициализирует свежесозданный объект.
Деструкторы и финализация
Деструктор играет роль противоположную конструктору и обычно вызывается при уничтожении объекта. Если конструктор нужен большинству классов, только некоторые из них нуждаются в деструкторе. Деструктор в основном должен освободить ресурсы, зарезервированные конструктором (или другими методами во время жизни объекта). Эти ресурсы включают память, файлы, базы данных, ресурсы windows и т. д.
В c++ деструкторы автоматически вызываются, когда объект выходит из области определения или когда вы удаляете объект, заведенный динамически. У каждого класса есть только один деструктор.
В java нет деструкторов. Объекты, на которые нет ссылок, уничтожаются сборщиком мусора, который работает в виде фоновой задачи (как описывалось ранее). Прежде чем уничтожать объект, сборщик мусора должен вызвать метод finalize(). Однако нет никакой гарантии, что этот метод вызывается в каждой jvm. По этой причине, если вам нужно освободить ресурсы, вы должны добавить какой-нибудь метод для этого, и убедиться, что он вызывается.
Инкапсуляция
Общим элементом этих языков является присутствие трех спецификаторов доступа, указывающих на различные уровни инкапсуляции класса: public, protected, и private. public означает: видимый любым другим классом, protected означает: видимый производными классами, private означает: отсутствие видимости извне. В деталях, однако, есть различия. c++: В c++ вы можете использовать ключевое слово friend для обхода инкапсуляции. Видимость по умолчанию для класса - private, для структур - public.
В java отличие
синтаксиса в том, что модификатор
доступа повторяется для
Файлы, юниты и пакеты
Важное различие между языками заключается в организации исходного кода в файлах. Языки используют файлы в качестве стандартного механизма для запоминания исходного кода классов, но компилятор c++, в отличие от java, не понимает файлов. Java работает с идеей модулей.
В c++ программист обычно помещает определение класса в файл объявлений, а определение методов - в отдельный файл кода. Обычно у этих двух файлов одинаковые имена и различные расширения. Компилируемый блок, как правило, ссылается (включает в себя) на свой файл объявлений и на файлы объявлений тех классов (или функций), на которые ссылается код. Все эти соглашения не утруждают компилятор. Это значит, что линкеру предстоит большая работа, потому что компилятор не может знать, в каком другом модуле может быть определен нужный метод.
В java каждый файл исходного кода или единица компиляции компилируется отдельно. Затем вы можете отметить группу единиц компиляции как части одного пакета. В отличие от C++, вы пишете весь код методов тут же при объявлении класса. При включении какого-либо файла предложением import, компилятор читает только public объявления, а не весь код:
import where.myclass;
import where.* // всеклассы
Классы и наследование
Наследование у классов - одно из оснований ООП. Оно может быть использовано для выражения генерализации или специализации. Основная идея в том, что вы определяете новый тип, расширяя или модифицируя существующий, другими словами, производный класс обладает всеми данными и методами базового класса, новыми данными и методами и, возможно, модифицирует некоторые из существующих методов. Различные ОО языки используют различные жаргоны для описания этого механизма (derivation, inheritance, sub-classing), для класса, от которого вы наследуете (базовый класс, родительский класс, суперкласс) и для нового класса (производный класс, дочерний класс, подкласс).
C++ использует слова public,protected, и private для определения типа наследования и чтобы спрятать наследуемые методы или данные, делая их приватными или защищёнными. Хотя публичное наследование наиболее часто используется, по умолчанию берётся приватное. Как мы увидим далее, C++ поддерживает множественное наследование. Вот пример синтаксиса наследования:
class dog: public animal
{
...
};
java использует слово extends для выражения единственного типа наследования, соответствующего публичному наследованию в c++. java не поддерживает множественное наследование. Классы java тоже происходят от общего базового класса.
class dog extends animal
{
...
}
Доступ к методам базового класса
Когда вы пишете метод класса или перекрываете метод базового класса, вам нередко надо сослаться на методы базового класса. Если этот метод переопределен в производном классе, то, используя его имя, вы получите новую версию. В Объектно-Ориентированных языках есть некоторые приёмы или ключевые слова, позволяющие решить эту проблему.
В C++ для указания нужного класса можно использовать оператор (::). Вы можете получить доступ не только к методам базового класса, но к классам выше по иерархии. Это очень мощная техника, но она создаёт проблемы, когда вы добавляете в иерархию промежуточный класс.
Java для этого использует ключевое слово super. В этом языке нет возможности сослаться на другой предшествующий класс. На первый взгляд, это может показаться ограничением, но оно позволяет расширять иерархию, вводя промежуточные классы. К тому же, если вы не нуждаетесь в функциях базового класса, вам, наверное, не следовало ему наследовать.