Doklad po JAVA

advertisement
Доклад по теме «Java»
JAVA
Класс языка:
Появился в:
Авторы:
Последняя версия:
Типизация данных:
явная (англ.)
Предки:
Повлиял на:
объектно-ориентированный, структурный, императивный
1995 г.
Sun Microsystems
Java Standard Edition 6 (1.6.13)
строгая полиморфная, статическая, безопасная, именованная (англ.),
Objective-C, C++, Smalltalk, Eiffel
Ада 2005, C#, D, ECMAScript, Groovy, J#, VJ#, JavaScript, PHP, Scala
Технология Java - это объектно-ориентированная, платформо-независимая, многопоточная
среда программирования. Это основа для "умных" Web- и сетевых сервисов, она
позволяет вам надежно и безопасно наращивать информационную структуру вашего
предприятия благодаря платформенной независимости. Все виды систем могут
взаимодействовать друг с другом - начиная со смарт карт и заканчивая
суперкомпьютерами - независимо от аппаратной платформы и системного программного
обеспечения.
Как это работает?
Когда программный продукт, написанный на языке программирования Java
компилируется с использованием технологии Java, получается байткод. Виртуальная
машина Java может интерпретировать этот байткод на любой платформе, на которой
установлена виртуальная машина Java. Это означает, что нет необходимости в
портировании программ.
Java (на языке оригинала — английском) — объектно-ориентированный язык
программирования, разрабатываемый компанией Sun Microsystems и официально
выпущенный 23 мая 1995 года. Иногда на русском языке произносят название как «Ява»,
по аналогии с названием острова Ява.
Java — так называют не только сам язык, но и платформу для создания приложений
уровня предприятий на основе данного языка.
Изначально язык программирования назывался Oak (русск. Дуб) и разрабатывался
Джеймсом Гослингом для бытовой электроники, но впоследствии был переименован в
Java и стал использоваться для написания клиентских приложений и серверного
программного обеспечения. Назван в честь марки кофе Java, любимого программистами,
поэтому на официальной эмблеме языка Java изображена чашка с дымящимся кофе.
История создания
Язык Java зародился как часть проекта создания передового программного обеспечения
(ПО) для различных бытовых приборов. Реализация проекта была начата на языке С++, но
вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение
самого инструмента - языка программирования. Стало очевидным, что необходим
платформо-независимый язык программирования, позволяющий создавать программы,
которые не приходилось бы компилировать отдельно для каждой архитектуры и можно
было бы использовать на различных процессорах под различными операционными
системами.
Рождению языка Java предшествовала довольно интересная история. В 1990 году
разработчик ПО компании Sun Microsystems Патрик Нотон (Patrick Naughton) понял, что
ему надоело поддерживать сотни различных интерфейсов программ, используемых в
компании, и сообщил исполнительному директору Sun Microsystems и своему другу
Скотту МакНили (Scott McNealy) о своем намерении перейти работать в компанию NeXT.
МакНили, в свою очередь, попросил Нотона составить список причин своего
недовольства и выдвинуть такое решение проблем, как если бы он был Богом и мог
исполнить все, что угодно.
Нотон, хотя и не рассчитывал на то, что кто-то обратит внимание на его письмо, все же
изложил свои претензии, беспощадно раскритиковав недостатки Sun Microsystems, в
частности, разрабатываемую в тот момент архитектуру ПО NeWS. К удивлению Нотона,
его письмо возымело успех: оно было разослано всем ведущим инженерам Sun
Microsystems, которые не замедлили откликнуться и высказать горячую поддержку своему
коллеге и одобрение его взглядов на ситуацию в Sun Microsystems. Обращение вызвало
одобрение и у высшего руководства компании, а именно, у Билла Джоя (Bill Joy),
основателя Sun Microsystems, и Джеймса Гослинга (James Gosling), начальника Нотона.
В тот день, когда Нотон должен был уйти из компании, было принято решение о создании
команды ведущих разработчиков с тем, чтобы они делали что угодно, но создали нечто
необыкновенное.
Команда из шести человек, с кодовым названием Green, ушла в самовольное изгнание,
погрузившись в исследования бытовых устройств, таких как Nintendo Game Boys,
устройств дистанционного управления. Команда Green пыталась найти средство, с
помощью которого можно было бы установить взаимодействие между этими
устройствами. Вскоре стало ясно, что такие электроприборы, как видеомагнитофоны,
проигрыватели лазерных дисков, стереосистемы - все они были реализованы на разных
процессорах. Это означало, что если производитель захочет добавить телевизору или
видеомагнитофону дополнительные функции или характеристики, он будет зажат в
рамках средств, зашитых в аппаратное обеспечение. Эта проблема, в сочетании с
ограниченностью памяти микросхем этих устройств, выдвинула новый подход к
программированию ПО, который должен был стать ведущим на рынке бытовой
электроники.
Команда приступила к разработке нового объектно-ориентированного языка
программирования, который был назван Oak (дуб), в честь дерева, росшего под окном
Гослинга.
Вскоре компания Sun Microsystems преобразовала команду Green в компанию First Person.
Новая компания обладала интереснейшей концепцией, но не могла найти ей подходящего
применения. После ряда неудач неожиданно ситуация для компании резко изменилась:
был анонсирован Mosaic - так родился World Wide Web, с которого началось бурное
развитие Internet.
Нотон предложил использовать Oak в создании Internet- приложений. Так Oak стал
самостоятельным продуктом, вскоре был написан Oak-компилятор и Oak-браузер
"WebRunner". В 1995 году компания Sun Microsystems приняла решение объявить о новом
продукте, переименовав его в Java (единственное разумное объяснение названию - любовь
программистов к кофе). Когда Java оказалась в руках Internet, стало необходимым
запускать Java-аплеты - небольшие программы, загружаемые через Internet. WebRunner
был переименован в HotJava и компания Netscape встала на поддержку Java-продуктов.
Основные особенности языка
Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной
(JVM) — программой, обрабатывающей байтовый код и передающей инструкции
оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от
текста, обрабатывается значительно быстрее. Достоинство подобного способа
выполнения программ — в полной независимости байт-кода от ОС и оборудования, что
позволяет выполнять Java-приложения на любом устройстве, которое поддерживает
виртуальную машину.
Приложения переносимы на многие платформы. Однажды написанное приложение не
придется модифицировать под другие платформы: оно будет работать без каких-либо
изменений на различных операционных системах и аппаратных архитектурах.
Java является объектно-ориентированным и одновременно простым языком
программирования.
Цикл разработки программных средств с использованием Java значительно сокращается в
силу того, что Java - интерпретируемый язык. Процесс компиляции-сборки-загрузки
устарел - теперь программу надо только откомпилировать и сразу запускать.
Приложения надежны: Java контролирует обращения к памяти.
Приложения высокопроизводительны: несмотря на то, что язык Java - интерпретируемый,
код Java программы оптимизируется до фазы исполнения.
Поддержка системы многопоточности позволяет создавать параллельно исполняемые
взаимодействующие легковесные процессы.
Приложения настраиваемы под изменяющееся окружение: возможна динамическая
загрузка программных модулей из любого места в сети.
Пользователи могут быть уверены в безопасности приложений, даже если в них загружен
программный код из любого места в Internet. Исполняющая система Java имеет
встроенную защиту от вирусов и попыток взлома.
Основные характеристики
Развитие Internet и World Wide Web заставляет совершенно по-новому рассматривать
процессы разработки и распределения программного обеспечения. Для того, чтобы
выжить в мире электронного бизнеса и распространения данных, язык Java должен быть
безопасным,
высокопроизводительным,
надежным.
Работа на различных платформах гетерогенных сетей отбрасывает традиционную схему
распределения ПО, версий ПО, модификации ПО, объединения ПО и т.д. Для решения
проблем гетерогенных сред язык должен быть
нейтральным к архитектуре,
переносимым,
динамически подстраиваемым.
Разработчики Java с самого начала хорошо понимали, что язык, предназначенный для
решения проблем гетерогенных сред, также должен быть
простым - его должны с легкостью использовать все разработчики
ясным - разработчики должны без больших усилий выучить Java
объектно-ориентированным - он использует все преимущества современных методологий
разработки ПО и подходит для написания распределенных клиент-серверных приложений
многопоточным - для обеспечения высокой производительности приложений,
выполняющих одновременно много действий (например, в мультимедийных системах)
интерпретируемым - для переносимости и большей динамичности.
Необходимо более подробно рассмотреть перечисленные характеристики Java.
Простота
Простота языка входит в ключевые характеристики Java: разработчик не должен
длительное время изучать язык, прежде чем он сможет на нем программировать.
Фундаментальные концепции языка Java быстро схватываются и программисты с самого
начала могут вести продуктивную работу. Разработчиками Java было принято во
внимание, что многие программисты хорошо знакомы с языком С++, поэтому Java,
насколько это возможно, приближен к С++.
В Java не включены некоторые редко используемые, плохо понимаемые и усложняющие
работу возможности С++, которые приносят больше проблем, чем преимуществ.
Пришлось отказаться от перегрузки операторов (но перегрузка методов в Java осталась),
множественного наследования, автоматического расширяющего приведения типов.
Добавилась автоматическая сборка мусора, упрощающая процесс программирования, но
несколько усложняющая систему в целом. В С и С++ управление памятью вызывало
всегда массу проблем, теперь же об этом не придется много заботиться.
Объектно-ориентированность
Язык Java с самого начала проектировался как объектно-ориентированный. Задачам
распределенных систем клиент-сервер отвечает объектно-ориентированная парадигма:
использование концепций инкапсуляции, наследования и полиморфизма. Java
предоставляет ясную и действенную объектно-ориентированную платформу разработки.
Программисты на Java могут использовать стандартные библиотеки объектов,
обеспечивающие работу с устройствами ввода/вывода, сетевые функции, методы создания
графических пользовательских интерфейсов. Функциональность объектов этих библиотек
может быть расширена.
Надежность
Платформа Java разработана для создания высоконадежного прикладного программного
обеспечения. Большое внимание уделено проверке программ на этапе компиляции, за
которой следует второй уровень - динамическая проверка (на этапе выполнения).
Модель управления памятью предельно проста: объекты создаются с помощью оператора
new. В Java, в отличие от С++, механизм указателей исключает возможность прямой
записи в память и порчи данных: при работе с указателями операции строго
типизированы, отсутствуют арифметические операции над указателями. Работа с
массивами находится под контролем управляющей системы. Существует автоматическая
сборка мусора.
Данная модель управления памятью исключает целый класс ошибок, так часто
возникающих у программистов на С и С++. Программы на Java можно писать, будучи
уверенным в том, что машина не "повиснет" из-за ошибок при работе с динамически
выделенной памятью.
Безопасность
Java разработана для оперирования в распределенных средах, это означает, что на первом
плане должны стоять вопросы безопасности. Средства безопасности, встроенные в язык, и
система исполнения Java позволяют создавать приложения, на которые невозможно
"напасть" извне. В сетевых средах приложения, написанные на Java, защищены от
вторжения неавторизованного кода, пытающегося внедрить вирус или разрушить
файловую систему.
Независимость от архитектуры
Java разработан для поддержки приложений, внедряемых в гетерогенные сетевые среды. В
подобных средах приложения должны исполняться на различных аппаратных
архитектурах, под управлением различных операционных систем и во взаимодействии с
интерфейсами различных языков программирования. Для обеспечения платформонезависимости программ компилятор Java генерирует байт-код - архитектурнонейтральный промежуточный формат программы, создаваемый для эффективной
передачи кода на различные аппаратные и программные платформы. При выполнении
программы байт-код интерпретируется исполняющей машиной Java. Один и тот же Javaбайткод будет исполняться на любой платформе.
Переносимость
Архитектурная независимость - лишь составная часть переносимости. В отличие от С или
С++ в Java не существует понятия "зависимости от реализации", когда речь идет о
размерности базовых типов. Форматы типов данных и операции над ними четко
определены. Тем самым, программы остаются неизменными на любой платформе - не
существует несовместимости типов данных на аппаратных и программных архитектурах.
Архитектурная независимость и переносимость программного обеспечения Java
обеспечивается виртуальной машиной Java (Java Virtual Mashine - JVM) - абстрактной
машиной, для которой компилятор Java генерирует код. Специальные реализации JVM
для конкретных аппаратных и программных платформ предоставляют уже конкретную
виртуальную машину. JVM базируется на стандарте интерфейса переносимых
операционных систем (POSIX).
Высокая производительность
Производительность всегда заслуживает особого внимания. Java достигает высокой
производительности благодаря специально оптимизированному байт-коду, легко
переводимому в машинный код. Автоматическая сборка мусора выполняется как фоновый
поток с низким приоритетом, обеспечивая высокую вероятность доступности требуемой
памяти, что ведет к увеличению производительности. Приложения, требующие больших
вычислительных ресурсов, могут быть спроектированы так, чтобы те части, которые
требуют интенсивных вычислений, были написаны на языке ассемблера и
взаимодействовали с Java платформой. В основном, пользователи ощущают, что
приложения взаимодействуют быстро, несмотря на то, что они являются
интерпретируемыми.
Интерпретируемость
Java-интерпретатор может выполнять Java байт-код на любой машине, на которой
установлен интерпретатор и система выполнения. На интерпретирующей платформе фаза
сборки программы является простой и пошаговой, поэтому процесс разработки
существенно ускоряется и упрощается, отсутствуют традиционные трудные этапы
компиляции, сборки, тестирования.
Многопоточность
Большинству современных сетевых приложений обычно необходимо осуществлять
несколько действий одновременно. В Java реализован механизм поддержки легковесных
процессов-потоков (нитей). Многопоточность Java предоставляет средства создания
приложений с множеством одновременно активных потоков.
Для эффективной работы с потоками в Java реализован механизм семафоров и средств
синхронизации потоков: библиотека языка предоставляет класс Thread, а система
выполнения предоставляет средства диспетчеризации и средства, реализующие семафоры.
Важно, что работа параллельных потоков с высокоуровневыми системными библиотеками
Java не вызовет конфликтов: функции, предоставляемые библиотеками, доступны любым
выполняющимся потокам.
Динамичность
По ряду соображений Java более динамичный язык, чем С++. Он был разработан
специально для подстройки под изменяющееся окружение. В то время как компилятор
Java на этапе компиляции и статических проверок не допускает никаких отклонений,
процесс сборки и выполнения сугубо динамический. Классы связываются только тогда,
когда в этом есть необходимость. Новые программные модули могут подключаться из
любых источников, в том числе, поставляться по сети. В случае с браузером HotJava и
другими подобными приложениями интерактивный выполняемый код может быть
загружен откуда угодно, что позволяет производить прозрачные модификации
приложений. В результате возможно создание интерактивных служб, безболезненно
модифицируемых, обслуживающих большое количество клиентов и обеспечивающих
развитие электронного бизнеса через Internet.
Вывод
Если описанные выше характеристики рассматривать по отдельности, то их можно найти
во многих программных платформах. Радикальное новшество заключается в способе,
предлагаемом Java и системой выполнения, который сочетает в себе все характеристики
для предоставления гибкой и мощной системы программирования.
Разработка приложений на Java приводит к получению программного обеспечения,
которое:
переносимо на разные архитектуры, операционные системы и графические
пользовательские интерфейсы
безопасно
высокопроизводительно
Благодаря Java работа по разработке программного обеспечения значительно упрощается,
все старания направлены на достижение конечной цели: вовремя получить передовой
продукт, опирающийся на солидную основу Java.
Основные возможности









автоматическое управление памятью
расширенные возможности обработки исключительных ситуаций;
богатый набор средств фильтрации ввода/вывода;
набор стандартных коллекций, таких как массив, список, стек и т. п.;
наличие простых средств создания сетевых приложений (в том числе с
использованием протокола RMI);
наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
встроенные в язык средства создания многопоточных приложений;
унифицированный доступ к базам данных на основе JDBC и SQLJ.
поддержка шаблонов (начиная с версии 1.5)
История версий
Java 1.0
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была
выпущена только в 1995 году.
Java 2.0
К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под
наименованием Java 2. Собственно языковых изменений в данной версии не появилось.
Платформа получила следующие дополнения:
 Набор средств для создания визуального интерфейса пользователя Swing.
 Коллекции.
 Поддержка файлов Policy и цифровых сертификатов пользователя.
 Библиотека Accessibility.
 Java 2D.
 Поддержка технологии drag-and-drop.
 Полная поддержка Unicode, включая поддержку ввода на японском, китайском и
корейском языках.
 Поддержка воспроизведения аудио-файлов нескольких популярных форматов.
 Полная поддержка технологии CORBA.
 JIT-компилятор, улучшенная производительность.
 Усовершенствования инструментальных средств JDK, в том числе поддержка
профилирования Java-программ
Java 5
Спецификация Java 5 была выпущена в сентябре 2004 года. В данной версии разработчики
внесли в язык целый ряд принципиальных дополнений:
 Перечислимые типы (enum). Ранее отсутствовавшие в Java типы оформлены по
аналогии с C++, но при этом имеют ряд дополнительных возможностей.
 Перечислимый тип является полноценным классом Java, то есть может иметь
конструктор, поля, методы, в том числе скрытые и абстрактные.
 Перечисление может реализовывать интерфейсы.
 Для перечислений имеются встроенные методы, дающие возможность
получения значений типа по имени, символьных значений, соответствующих
именам, преобразования между номером и значением, проверки типа на то,
что он является перечислимым.
 Аннотации — возможность добавления в текст программы метаданных, не
влияющих на выполнение кода, но допускающих использование для получения
различных сведений о коде и его исполнении. Одновременно выпущен
инструментарий для использования аннотированного кода. Одно из применений
аннотаций — упрощение создания тестовых модулей для Java-кода.
 Средства обобщённого программирования (generics) — механизм, аналогичный
шаблонам в C++ или C#, дающий возможность создавать классы и методы с
полями и параметрами произвольного типа. С использованием данного механизма
реализованы новые версии коллекций стандартной библиотеки Java.
 Методы с неопределённым числом параметров.
 Autoboxing/Unboxing — автоматическое преобразование между скалярными
типами Java и соответствующими типами-врапперами (например, между int —
Integer). Наличие такой возможности упрощает код, поскольку исключает
необходимость в выполнении явных преобразований типов в очевидных случаях.
 Разрешён импорт статических переменных.
 В язык введён цикл по коллекции объектов (итератор).
Классификация платформ Java
Внутри Java существуют три основных семейства технологий:



J2EE или Java EE (начиная с v1.5) — Java Enterprise Editon, для создания
программного обеспечения уровня предприятия;
J2SE или Java SE (начиная с v1.5) — Java Standard Editon, для создания
пользовательских приложений, в первую очередь — для настольных систем;
J2ME, Java ME или Java Micro Edition, для использования в устройствах,
ограниченных по вычислительной мощности, в том числе мобильных телефонах,
PDA, встроенных системах
Самыми популярными считаются серверные технологии семейства J2EE.
Последним релизом является версия 1.6, в которой было произведено улучшение системы
безопасности, улучшение поддержки XML, а также добавлена поддержка скриптового
языка JavaScript на основе механизма Mozilla Rhino (англ.), улучшена интеграция с
рабочим столом, добавлены некоторые новые возможности в создании графических
интерфейсов.
Применения платформы Java
Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий:
Amazon, eBay, Flickr, Google (Gmail), Yandex, LinkedIn.
Следующие компании в основном фокусируются на Java (J2EE) технологиях, а не на
.NET, хотя имеют дело также и с последними: SAP, IBM, Oracle.
Java и Microsoft
Компанией Microsoft была разработана собственная реализация JVM (MSJVM),
включавшаяся в состав различных ОС, начиная с Windows 95. MSJVM была близка к
спецификации Sun Microsystems v.1.1.3, но не соответствовала ей по ряду
принципиальных характеристик (в частности, по отсутствию поддержки технологий RMI
и JNI и по наличию нестандартных расширений). Впоследствии это явилось поводом для
судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании
Sun Microsystems. В конечном счёте между двумя компаниями была достигнута
договорённость о возможности продления срока официальной поддержки пользователей
нестандартной Microsoft JVM до конца 2007 года. В настоящее время компанией Microsoft
для платформы .NET предлагается Java-подобный язык J#, не соответствующий
официальной спецификации языка Java.
В каких ОС работает Java.
Ведущие фирмы быстро оценили уникальные достоинства языка – в первую очередь, его
полную независимость от операционной системы, под управлением которой выполняются
Java-программы. В разработку средств создания и выполнения Java-приложений
включились такие крупные компании, как Microsoft, IBM, Oracle, Sybase, DEC,
Borland/Inprise и целый ряд других.
Хотя ряд систем разработки предоставляет возможность скомпилировать исходный код
Java в исполняемый модуль для вполне определенной операционной системы, в общем
случае компилятор Java создает стандартный код, который может быть выполнен и на
Windows, и под управлением OS Solaris, и вообще везде, где имеется среда выполнения
Java – т. е. на большинстве платформ, использующихся в современных компьютерных
системах. Помимо упомянутых ОС, на сегодняшний день в список операционных систем,
для которых созданы собственные JRE, входят Linux, NetWare, MacOS, OS/2, UnixWare,
AIX, IRIX, SCO OpenServer, DigitalUnix, HP UNIX, OS/390, а также ряд других
операционных систем, и список этот продолжает расширяться. Наконец, интерпретатор
Java имеется в наиболее распространенных обозревателях Интернета, включая Netscape
Navigator и Microsoft Internet Explorer. Это позволяет загружать через Интернет и
выполнять прямо в обозревателе простые Java-программы (апплеты), внедренные прямо в
текст WWW-страницы.
Где выполняется JAVA?
Если Ваш браузер относится к одному из нижеперечисленных, то у Вас возможна
поддержка Java:
 Internet Explorer – версии от 3.0 до 5.5 (входит в поставку)
 Netscape – версии от 2.0 и выше (входит в поставку)
 Mozilla любой версии (нужно установить JRE)
 Konqueror любой версии (нужно установить JRE)
 Firebird любой версии (нужно установить JRE)
 Opera – версии от 4.x и выше (нужно установить JRE)
Если у Вас установлены нижеследующие браузеры (что очень маловероятно),
то Вам следует поставить один из выше перечисленных браузеров:



Internet Explorer – версии от 1.0 до 2.0
Netscape – версии 1.0
Opera – версии 3.x и ниже
Особое место занимает Internet Explorer 6.x на платформе Windows XP. JVM почему-то не
идет в официальной поставке этих продуктов, как было ранее. Если у установлена
Windows XP, то для работы с аплетами Вам придется установить виртуальную машину
Java самостоятельно.
Сервлеты и апплеты
Сервлет является Java-программой, выполняющейся на стороне сервера и расширяющей
функциональные возможности сервера. Сервлет взаимодействует с клиентами
посредством принципа запрос-ответ.
Сервлеты должны реализовывать Servlet интерфейс, который определяет методы
жизненного цикла.
Хотя сервлеты могут обслуживать любые запросы, они обычно используются для
расширения веб-серверов. Для таких приложений технология Java Servlet определяет
HTTP-специфичные сервлет классы.
Пакеты javax.servlet и javax.servlet.http обеспечивают интерфейсы и классы для создания
сервлетов.
Java-апплет — это прикладная программа на Java в форме байт-кода. Java-апплеты
выполняются в веб-браузере с использованием виртуальной Java машины (JVM), или в
Sun's AppletViewer, автономном инструменте для тестирования апплетов. Java-апплеты
были внедрены в первой версии языка Java в 1995. Java-апплеты обычно пишутся на языке
программирования Java, но могут быть написаны и на других языках, которые
компилируются в байт‐код Java, таких, как Jython.
Апплеты используются для предоставления интерактивных возможностей вебприложений, которые не могут быть предоставлены HTML. Так как байт-код Java
платформо-независим, то Java-апплеты могут выполняться с помощью плагинов
браузерами многих платформ, включая Microsoft Windows, UNIX, Apple Mac OS и
GNU/Linux. Такие программы с открытым исходным кодом, как applet2app[1], могут быть
использованы для преобразования апплета в самостоятельные программы на Java или
исполняемые файлы Linux и Windows.
Java Servlet иногда неофициально сравнивают с серверным апплетом, но он отличается
своим языком, функциями и каждой из описанных здесь характеристик апплетов.
Пример программы
Программа, выводящая «Hello, World!»:
…………………………………………….
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
…………………………………………….
Пример использования шаблонов:
……………………………………………
import java.util.*;
public class Sample {
public static void main(String[] args) {
// Создание объекта по шаблону.
List<String> strings = new LinkedList<String>();
strings.add("Hello");
strings.add("world");
strings.add("!");
for (String s : strings) {
System.out.print(s);
System.out.print(" ");
}
}
}
……………………………………………..
Основные идеи:
Примитивные типы
В языке Java только 8 скалярных типов: boolean, byte, char, short, int, long, float, double.
Классы-обёртки примитивных типов:
 Byte
 Short
 Integer
 Long
 Float
 Double
 Boolean
 Character
Длины и диапазоны значений примитивных типов определяются стандартом, а не
реализацией.
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформеннонезависимым, что является одним из идеологических требований к Java и одной из причин
её успеха. Тем не менее одна небольшая проблема с платформенной независимостью всё
же осталась. Некоторые процессоры используют для промежуточного хранения
результатов 10-байтовые регистры или другими способами улучшают точность
вычислений. Для того, чтобы сделать Java максимально совместимой между разными
системами, в ранних версиях любые способы повышения точности вычислений были
запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что
ухудшение точности ради платформенной независимости мало кому нужно, тем более
если за это приходится платить замедлением работы программ. После многочисленных
протестов этот запрет отменили, но добавили ключевое слово strictfp, запрещающее
повышение точности.
Преобразования при математических операциях
В языке Java действуют следующие правила:
1. Если один операнд имеет тип double, другой тоже преобразуется к типу double.
2. Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
3. Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
4. Иначе оба операнда преобразуется к типу int.
Объектные переменные, объекты, ссылки и указатели
В языке Java имеются только динамически создаваемые объекты. Причем переменные
объектного типа и объекты в Java — совершенно разные сущности. Переменные
объектного типа являются ссылками, то есть неявными указателями на динамически
создаваемые объекты. Это подчёркивается синтаксисом описания переменных.
Так, в Java нельзя писать:
……………………………..
double a[10][20];
Foo b(30);
……………………………..
а нужно:
……………………………...
double[ ][ ] a = new double[10][20];
Foo b = new Foo(30);
……………………………..
При присваиваниях, передаче в подпрограммы и сравнениях объектные переменные ведут
себя как указатели, то есть присваиваются, копируются и сравниваются адреса объектов.
А при доступе с помощью объектной переменной к полям данных или методам объекта не
требуется никаких специальных операций разыменовывания — этот доступ
осуществляется так, как если бы объектная переменная была самим объектом.
Объектными являются переменные любого типа, кроме простых числовых типов. Явных
указателей в Java нет. В отличие от указателей C, C++ и других языков
программирования, ссылки в Java в высокой степени безопасны благодаря жёстким
ограничениям на их использование, в частности:
 Нельзя преобразовывать объект типа int или любого другого примитивного типа в
указатель или ссылку и наоборот.
 Над ссылками запрещено выполнять операции ++, −−, +, − или любые другие
арифметические операции.
 Преобразование типов между ссылками жёстко регламентировано. За исключением
ссылок на массивы, разрешено преобразовывать ссылки только между
наследуемым типом и его наследником, причём преобразование наследуемого типа
в наследующий должно быть явно задано и во время выполнения производится
проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь
тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов
размерности.

В Java нет операций взятия адреса (&) или взятия объекта по адресу (*). Звёздочка
в Java означает умножение, и только. Амперсанд (&) означает всего лишь
«побитовое и» (двойной амперсанд — «логическое и»).
Благодаря таким специально введенным ограничениям в Java невозможно прямое
манипулирование памятью на уровне физических адресов (хотя ссылки, не указывающие
ни на что, есть: значение такой ссылки обозначается null).
Дублирование ссылок и клонирование
Из-за того, что объектные переменные являются ссылочными, при присваивании не
происходит копирования объекта. Так, если написать
………………..
Foo foo, bar;
…
bar = foo;
……………..
то произойдет копирование адреса из переменной foo в переменную bar. То есть foo и bar
будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка
изменить поля объекта, на который ссылается переменная foo, будет менять объект, с
которым связана переменная bar, и наоборот. Если же необходимо получить именно ещё
одну копию исходного объекта, пользуются или методом (функцией-членом, в
терминологии C++) clone(), создающим копию объекта, или же копирующим
конструктором.
Метод clone() требует, чтобы класс реализовывал интерфейс Cloneable (об интерфейсах
см. ниже). Если класс реализует интерфейс Cloneable, по умолчанию clone() копирует все
поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и
так далее), надо переопределять метод clone(). Определение и использование метода
clone() часто является нетривиальной задачей.
Сборка мусора
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована
сборка мусора. Традиционным приёмом, дающим сборщику мусора «намёк» на
освобождение памяти, является присваивание переменной пустого значения null. Это,
однако, не значит, что объект, заменённый значением null, будет непременно и
немедленно удалён. Данный приём всего лишь устраняет ссылку на объект, то есть
отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не
будет удален сборщиком мусора, пока на него указывает хотя бы одна ссылка из
используемых переменных или объектов. Существуют также методы для инициации
принудительной сборки мусора, но не гарантируется, что они будут вызваны
исполняющей средой, и их не рекомендуется использовать для обычной работы.
Классы и функции
Java не является процедурным языком: любая функция может существовать только внутри
класса. Это подчёркивает терминология языка Java, где нет понятий «функция», а только
метод. В методы превратились и стандартные функции. Например, в Java нет функции
sin(), а есть метод Math.sin() класса Math (содержащего, кроме sin(), методы cos(), exp(),
sqrt(), abs() и многие другие).
Статические методы и поля
Для того чтобы не надо было создавать объект класса Math (и других аналогичных
классов) каждый раз, когда надо вызвать sin() (и другие подобные функции), введено
понятие статических методов (англ. static method; иногда в русском языке они называются
статичными). Статический метод (отмечаемый ключевым словом static в описании) можно
вызвать, не создавая объекта его класса. Поэтому можно писать
…………………………
double x = Math.sin(1);
………………………….
Вместо
…………………………
Math m = new Math();
double x = m.sin(1);
…………………………
Ограничение, накладываемое на статические методы, заключается в том, что в объекте
this они могут обращаться только к статическим полям и методам.
Статические поля имеют тот же смысл, что и в C++: каждое существует только в
единственном экземпляре.
Финальность
Ключевое слово final (финальный) означает разные вещи при описании переменной,
метода или класса. Финальная переменная инициализируется при описании и дальше не
может быть изменена. Финальный метод не может быть переопределён при наследовании.
Финальный класс не может иметь наследников вообще.
Абстрактность
В Java методы, не объявленные явно как final или private, являются виртуальными в
терминологии C++: при вызове метода, по-разному определённого в базовом и
наследующем классах, всегда производится проверка времени выполнения.
Абстрактным методом (описатель abstract) в Java называется метод, для которого заданы
параметры и тип возвращаемого значения, но не тело. Абстрактный метод определяется в
классах-наследниках. В C++ то же самое называется чисто виртуальной функцией. Для
того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен
быть описан как абстрактный. Объекты абстрактного класса создавать нельзя.
Интерфейсы
Высшей степенью абстрактности в Java является интерфейс (interface). Все методы
интерфейса абстрактны: описатель abstract даже не требуется. Интерфейс не является
классом. Класс может наследовать, или расширять (extends) другой класс или
реализовывать (implements) интерфейс. Кроме того, интерфейс может наследовать, или
расширять другой интерфейс.
В Java класс не может наследовать более одного класса, зато может реализовывать
сколько угодно интерфейсов.
Интерфейсы можно передавать методам как параметры, но нельзя создавать объекты их
типов.
Маркерные интерфейсы
В Java есть некоторые интерфейсы, которые не содержат методов для реализации, а
специальным образом обрабатываются JVM. Это интерфейсы:
 java.lang.Cloneable
 java.io.Serializabl
 java.rmi.Remote
Шаблоны в Java (generics)
Начиная с версии Java 5 в языке появился механизм обобщённого программирования —
шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в
описании классов и методов можно указать параметры-типы, которые внутри описания
могут использоваться в качестве типов полей, параметров и возвращаемых значений
методов.
……………………………………………..
// Объявление обобщённого класса
class GenericClass<E>
{
E getFirst() { ... }
void add(E obj) { ... }
}
// Использование обобщённого класса в коде
GenericClass <String> var = new GenericClass<String>();
var.add("qwerty");
String p = var.getFirst();
……………………………………………
Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того,
синтаксис поддерживает ограниченные объявления типов-параметров: указание в
объявлении конструкции вида <T extends A & B & C...> требует, чтобы тип-параметр T
реализовывал интерфейсы A, B, C и так далее, а конструкция <T super C> требует, чтобы
тип-параметр T был типом C или одним из его предков.
В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения —
компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация
шаблонов в Java принципиально отличается от реализации аналогичных механизмов в
C++: компилятор не порождает для каждого случая использования шаблона отдельный
вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода,
содержащую необходимые проверки и преобразования типов. Это приводит к ряду
ограничений использования шаблонов в программах на Java.
Проверка принадлежности к классу
В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo
instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или
реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует
интерфейс, который наследует Foo).
Далее, функция getClass(), определённая для всех объектов, выдаёт объект типа Class. Эти
объекты можно сравнивать. Так, например, foo.getClass()==bar.getClass() будет истинно,
если объекты foo и bar принадлежат в точности к одному классу (но это не означает что
это два одинаковых объекта).
Кроме того, объект типа Class любого типа можно получить так: Integer.class, Object.class.
Однако прямое сравнение классов не всегда является оптимальным средством проверки
на принадлежность к классу. Зачастую вместо него используют функцию
isAssignableFrom(). Эта функция определена у объекта типа Class и принимает объект типа
Class в качестве параметра. Таким образом, вызов Foo.class.isAssignableFrom(Bar.class)
вернёт true в случае, если Foo является предком класса Bar. Так как все объекты являются
потомками типа Object, вызов Object.class.isAssignableFrom() всегда вернёт true. В паре с
упомянутыми функциями объекта типа Class используются также функции isInstance()
(эквивалентно instanceof), а также cast() (преобразует параметр в объект выбранного
класса).
Библиотеки классов



JDK — содержит набор базовых классов для всего ПО на платформах Java SE и
Java EE
CDK — для создания химического ПО
MARF — модульная библиотека для распознавания аудио
Средства разработки ПО




JDK — помимо набора библиотек для платформ Java SE и Java EE содержит
компилятор командной строки javac и набор утилит, также работающих в режиме
командной строки.
NetBeans IDE — бесплатная интегрированная среда разработки для всех платформ
Java — Java ME, Java SE и Java EE. Пропагандируется Sun Microsystems,
разработчиком Java, как базовое средство для разработки ПО на языке Java и
других языках (C, C++, Ruby, Fortran и др.).
Eclipse — бесплатная интегрированная среда разработки для Java SE и Java EE.
Ведутся работы по поддержке в Eclipse платформы Java ME. Пропагандируется
IBM, одним из важнейших разработчиков корпоративного ПО, как базовое
средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и
др.)
IntelliJ IDEA — коммерческая среда разработки для платформ Java SE, Java EE и
Java ME.
Где взять средства разработки для JAVA?
Во-первых, необходима виртуальная машина Java (runtime) и компилятор для Java. Такой
комплект называется jdk -- java development kit. Есть несколько разновидностей, надо
брать Standard Edition, SE.
Текущая стабильная версия jdk 1.4.2. В некотором смысле эталонная реализация от
фирмы Sun (прародителя и продвигателя Java) можно найти здесь:
http://java.sun.com/j2se/1.4.2/download.html
Стоит также взять среду для разработки Java программ. Есть две конкурирующих
платформы -- NetBeans (Sun и доборовольцы) и Eclipse (IBM и добровольцы). И то и
другое написано на Java, требует неслабо ресурсов.
NetBeans (http://www.netbeans.org/) можно скачать с сайта Sun в паре с jdk
(http://java.sun.com/j2se/1.4.2/download-netbeans.html)
А Eclipse 2, www.eclipse.org -- красивая и относительно быстрая среда.
Eclipse можно взять здесь -- http://www.eclipse.org/downloads/index.php
Все версии и документацию к ним всегда можно бесплатно получить на официальном
web-сайте Java http://java.sun.com/ или
http://java.sun.com/products/index.html
Где почитать об JAVA?
http://ru.sun.com/java/whatisjava.html
http://ru.wikipedia.org/wiki/Java
http://www.intuit.ru/department/pl/javapl/
http://www.hardline.ru/1/3/
http://www.mobukom.ru/cit/internet/iinet97/14.html
Download