Что было написано на java
Java Standart Edition 7 Update 9 [1] , Java Standart Edition 6 Update 37 (17 октября 2012)
Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.
Содержание
Написание в русском языке
В русском языке распространены два варианта написания: «Джава» и «Ява». [11] Правообладатели торговой марки Java считают, что правильное написание — транслитерация «Джава», и не признают слово «Ява», соответствующее традиционному произношению названия острова Ява. Компания Sun (ныне принадлежащая Oracle) придерживается англоязычного произношения во всех странах мира. [12]
Иногда в обиходе используют также жаргонное слово «Жаба» (например, изображение жабы есть на календариках группы российских пользователей Джавы (Java Users Group). [13]
Джавой называют не только сам язык, но и платформу для создания и исполнения приложений на основе данного языка.
Изначально язык назывался «Дубом» (Oak) и разрабатывался Джеймсом Гослингом для программирования бытовых электронных устройств. Впоследствии он был переименован в «Джаву» и стал использоваться для написания клиентских приложений и серверного программного обеспечения. Назван в честь марки кофе «Ява» (по имени одноименного острова, где производится этот сорт), поэтому на официальной эмблеме языка изображена чашка с дымящимся кофе. Существует и другая версия происхождения названия языка, связанная с аллюзией на кофе-машину, как пример бытового устройства, для программирования которого изначально язык создавался.
Основные особенности языка
Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

Достоинство подобного способа выполнения программ — в полной независимости байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание.
Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. В последнее время был внесен ряд усовершенствований, которые несколько увеличили скорость выполнения программ на Java:
- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
- широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее. [14] С другой стороны, для большинства из них потребление памяти Java-машиной было в 10-30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++ [15] [16] [17] .
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. [18] Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы .NET компанией Microsoft.
История версий
Java 1.0
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только в 1996 году.
Java 1.2
К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Язык практически не изменился — было добавлено одно ключевое слово strictfp. Платформа получила следующие дополнения:
-
Swing для создания графического интерфейса пользователя .
- Коллекции (JSR 166).
- Поддержка файлов Policy и цифровых сертификатов пользователя.
- Библиотека Accessibility.
- Java 2D.
- Поддержка технологии drag-and-drop.
- Полная поддержка Unicode, включая поддержку ввода на японском, китайском и корейском языках.
- Поддержка воспроизведения аудиофайлов нескольких популярных форматов.
- Полная поддержка технологии CORBA.
- JIT-компилятор, улучшенная производительность.
- Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ
Java 2
В данном случае встречается путаница. Выпускались книги, например, Beginning Java 2 by Ivor Horton (Mar 1999), фактически по JDK 1.2 (бывшее название — Java 2). Вместе с тем, по сей день такие книги публикуются, например: Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределенные приложения (2011).
В то время, когда, как известно, Java 2 была исторически заменена следующими релизами, подобные названия книг дезориентируют в понимании, о какой же версии Java они написаны на самом деле. Если JDK 1.2 принято считать за Java 2, а авторы книг за Java 2 принимают JDK 7, это приводит к полной путанице.
Java 5.0
Спецификация Java 5.0 была выпущена в сентябре 2004 года. C этой версии изменена официальная индексация, вместо Java 1.5 правильнее называть Java 5.0. Внутренняя же индексация Sun осталась прежней — 1.x. Минорные изменения теперь включаются без изменения индексации, для этого используется слово «Update» или буква «u», например Java Development Kit 5.0 Update 22. Предполагается, что в обновления могут входить как исправления ошибок так и небольшие добавления в API, JVM.
В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
-
(англ. enum ). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.
- Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе скрытые и абстрактные.
- Перечисление может реализовывать интерфейсы.
- Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым.
- Коллекции — добавлены интерфейсы для организации очереди, работающей с двух сторон коллекции; организовывающие поиск по ближайшему соответствию; блокирующие себя во время ожидания элемента. Организованы новые классы, реализующие перечисленные интерфейсы.
- Добавлена поддержка японского императорского календаря (наряду с уже существующими григорианским и буддийским календарями).
- Доступны классы-потоки для чтения и передачи сжатых данных, с возможностью передачи их по сети. Сняты ограничения на количество файлов в архиве (ранее 64Кб), длину названия файла (ранее 256 символов) и количество одновременно открытых файлов (ранее 2000 шт).
- Организована система управления кешэм и добавлена поддержка параметра «no-cache» в HTTP-запросе.
- JConsole, графический мониторинг JVM, стала официально поддерживаемой утилитой.
- Java HTTP Server, позволяет создать полноценный HTTP сервер, с минимально необходимыми функциональными свойствами.
- Повысилась скорость вычислений на 70%, скорость операций ввода/вывода возросла в два раза. [19]
- Swing — улучшена работоспособность OpenGL и DirectX; обработка текста на LCD; добавлен GifWriter, для работы с файлами .gif.
- Исправлено большое количество ошибок.
- Поддержка динамически-типизированных языков (InvokeDynamic) — расширение JVM (семантики байт-кода), языка Java для поддержки динамически-типизированных языков.
- Строгая проверка class-файлов — class-файлы версии 51 (Java Standart Edition 7) или более поздней версии должны быть проверены typechecking верификатором; JVM не должна переключаться на старый верификатор.
- Изменение синтаксиса языка Java (Project Coin) — частичные изменения в языке Java, предназначенные для упрощения общих задач программирования:
- Использование класса String в блоке switch.
- Закрытие используемых ресурсов в блоке try (try-with-resources) — работает при использовании интерфейса AutoCloseable.
- Объединённая обработка исключений в блоке catch (multi-catch exceptions) — перечисление обрабатываемых исключений в catch (… | … | …).
- Повторное выбрасывание исключений (rethrowing exceptions) — передача возникшего исключения «вверх» по стеку вызовов.
- Подчёркивания в числовых литералах для лучшего восприятия больших чисел.
- Изменение вывода типа в Java generic при создании объекта.
- Использование двоичных чисел (binary literals) — префикс «0b» укажет, что используется двоичное число.
- Упрощение вызова методов varargs — уменьшение предупреждений при вызове метода с переменным числом входящих переменных.
- Модификация загрузчика классов (class-loader) — избежание тупиковых ситуаций в неиерархической топологии загрузки классов.
- Закрытие ресурсов, открытых URLClassLoader.
- Обновление коллекций (JSR 166y).
- Поддержка Unicode 6.0.
- Отделение языка пользователя и языка пользовательского интерфейса — обновление обработки языков для отделения локали от языка пользовательского интерфейса.
- Новые интерфейсы I/O для платформы Java (nio.2).
- Использование JDBC 4.1 и Rowset 1.1.
- (не закончено) …
Классификация платформ Java
Внутри Java существуют несколько основных семейств технологий:
-
— Java Standard Edition, основное издание Java, содержит компиляторы, API, Java Runtime Environment; подходит для создания пользовательских приложений, в первую очередь — для настольных систем. — Java Enterprise Edition, представляет собой набор спецификаций для создания программного обеспечения уровня предприятия. — Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например в мобильных телефонах, КПК, встроенных системах; — технология, являющаяся следующим шагом в эволюции Java как Rich Client Platform; предназначена для создания графических интерфейсов корпоративных приложений и бизнеса. — технология предоставляет безопасную среду для приложений, работающих на смарт-картах и других устройствах с очень ограниченным объемом памяти и возможностями обработки.
Java и Microsoft
Компанией Microsoft была разработана собственная реализация JVM (MSJVM [24] ), включавшаяся в состав различных операционных систем, начиная с Windows 98 (также входила в Internet Explorer от версии 3 и выше, что позволяло использовать MSJVM в ОС Windows 95 и Windows NT 4 после установки IE3+ на данные ОС).
MSJVM имела cущественные отличия от Sun Java, во многом ломающие основополагающую концепцию переносимости программ между разными платформами:
- отсутствие поддержки программного интерфейсавызова удаленных методов (RMI);
- отсутствие поддержки технологии JNI;
- наличие нестандартных расширений, таких как средства интеграции Java и DCOM, работающих только на платформе Windows.
Тесная интеграция Java с DCOM и Win32 ломала многоплатформенную суть языка. Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более. [24]
В 2005 году компанией Microsoft для платформы .NET был представлен Java-подобный язык J#, не соответствующий официальной спецификации языка Java и исключённый впоследствии из стандартного инструментария разработчика Microsoft Visual Studio, начиная с Visual Studio 2008 [25] .
Java и Android
Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код, для использования их виртуальной машиной Dalvik. Для такой компиляции используется дополнительный инструмент, а именно Software Development Kit, который предназначен для x86-машины под операционной системой Linux. Его разработали представители компании Google.
Разработку приложений можно вести в среде Eclipse, используя при этом плагин — Android Development Tools (ADT). Версия JDK при этом должна быть 5.0 или выше.
Применения платформы Java
Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: RuneScape, Amazon [26] [27] , eBay [28] [29] , Yandex (неоднозначная информация в отношении Java) [30] [31] , LinkedIn [32] , Yahoo! [33] .
Следующие компании в основном фокусируются на Java (J2EE) технологиях: SAP, IBM, Oracle. В частности, СУБД Oracle включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, хранимые процедуры. [34]
Производительность
Программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке Си [источник не указан 431 день] . Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997—1998 годах так называемого JIT-компилятора в версии 1.1 в дополнение к другим особенностям языка для поддержки лучшего анализа кода (такие как внутренние классы, класс StringBuffer, упрощенные логические вычисления и т. д.). Кроме того была произведена оптимизация виртуальной машины Java — с 2000 года для этого используется виртуальная машина HotSpot. По состоянию на февраль 2012 года, код Java 7 приблизительно лишь в 1.8 раза медленнее кода, написанного на языке Cи [35] .
Некоторые платформы предлагают аппаратную поддержку выполнения для Java [источник не указан 431 день] . К примеру, микроконтроллеры выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение байткода Java через опцию Jazelle.
Основные возможности
-
;
- расширенные возможности обработки исключительных ситуаций;
- богатый набор средств фильтрации ввода/вывода;
- набор стандартных коллекций: массив, список, стек и т. п.;
- наличие простых средств создания сетевых приложений (в том числе с использованием протоколаRMI);
- наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
- встроенные в язык средства создания многопоточных приложений;
- унифицированный доступ к базам данных:
- на уровне отдельных SQL-запросов — на основе JDBC, SQLJ;
- на уровне концепции объектов, обладающих способностью к хранению в базе данных — на основе Java Data Objects (англ.) и Java Persistence API;
- поддержка обобщений(начиная с версии 1.5);
- параллельное выполнение программ.
- Если один операнд имеет тип double, другой тоже преобразуется к типу double.
- Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
- Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
- Иначе оба операнда преобразуются к типу int.
- Нельзя преобразовывать объект типа int или любого другого примитивного типа в указатель или ссылку и наоборот.
- Над ссылками запрещено выполнять операции ++, −−, +, − или любые другие арифметические операции.
- Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано и во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности.
- В Java нет операций взятия адреса (&) или взятия объекта по адресу (*). Звёздочка в Java означает умножение, и только. Амперсанд (&) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»). Однако для булевых типов одиночный амперсанд означает «логическое и», отличающееся от двойного тем, что цепь проверок не прекращается при получении в выражении значения false [38] (напр. a == b && foo() == bar() не повлечёт вызовов foo() и bar() в случае, если a != b , тогда как использование & повлечёт в любом случае.
- java.lang.Cloneable
- java.io.Serializable
- java.rmi.Remote
- Игры: Minecraft (но в gamedev в основном C#/C++ используется)
- Приложения на Андроид: Java является основным языком для написания программ на андроид
- Приложения: используюя JavaFX, или Swing, или какую-либо другую библиотеку, можно с легкостью создавать приложения для компьютера. Допустим, компилятор Eclipse написан на C и Java. Gmail написан на Java. Nasa World Wind написан на C# и Java.
- высоконагруженные системы (Google, Yandex были разработаны в том числе на Java);
- банковские веб-приложения (Сбербанк, Альфа Банк, ВТБ 24 созданы руками Java-программистов);
- игры (Minecraft);
- искусственный интеллект (Whatson, ViaVoice);
- мобильные приложения (Telegram и Signal);
- интернет-магазины (Ebay, Amazon).
- Плюсом будет привычность для людей, перешедших на Java с функциональных языков.
- В редких ситуациях позволяет сделать код более читабельным и удобным.
- Отдельным пунктом стоит технология Stream API, которая позволяет обрабатывать потоки данных в функциональном стиле. Это действительно удобно и часто применяется на практике, в частности с Java 11+, где повысили эффективность использования ресурсов при создании стрима. В Java 8 создание стрима было более ресурсозатратным. Проще говоря, вы можете в функциональном стиле через точку провести множество операций над потоком (отфильтровать, отсортировать и т. д.).
- Ещё один плюс — лямбда, которая существенно уменьшает объём кода. Например при реализации анонимного класса, реализующего интерфейс с одним методом, а-ля функциональный.
- Распараллеливание стримов.
- Возможность более красиво, с меньшим количеством кода работать с коллекциями: есть готовые варианты с различными реализациями, например Google-коллекции.
- Всё же Java изначально заточена под ООП, а функциональная нотка с 8 версии — всего лишь нотка, и зачастую выглядит лишней.
- Сложная читаемость кода, в частности при обработке данных через Stream API образуется так называемая «простыня» кода, которая тяжела для восприятия.
- Возвращаясь к первому пункту, смесь ООП кода и функционального может выглядеть неуместной, а иногда даже вводить в заблуждение (не относится к лямбде).
- Если не знаете с чего начать, то возьмите на вооружение второе издание «Java head first». Будет понятно понятно даже тем, кто вовсе не знаком с программированием.
- Пользуйтесь YouTube. Просто забивайте в поиск то, что вам нужно. Мне было трудно по книге понять, что и как устанавливать в первый раз, поэтому я смотрел видео связанные с темой введения в Java .
- По книге идите вплоть до главы про Объектвиль. Проходите её, а затем начинайте проходить Базовый курс на Степике. Это сложный курс, местами даже покажется, что трудно двигаться вперед, но он эффективный. Сложные задачи помогут быстрее понять особенности языка, да и в целом учиться куда приятнее, когда монструозные задачи удаётся решать как задачки по умножению в начальной школе.
- Ещё для отработки базовых знаний можно пройти 15–20 уровней JavaRush.
- Зачем я это делаю? На протяжении всего обучения Java я задавал себе этот вопрос, и ответ был всегда одним и тем же. Для меня главной мотивацией было то, что просто зарабатывать деньги — это скучно, и рано или поздно превращается в рутину, а мне бы не хотелось, будучи уже старым, осознавать, что я положил свою жизнь на алтарь нелюбимого дела. IT-индустрия открывала возможность заниматься интересными задачами и зарабатывать достаточно, чтобы не думать о деньгах.
- Ментор. Для меня важно было наличие человека, который направляет и поддерживает. Путь в Java Development довольно сложный, со множеством ям и развилок, и неподготовленному человеку крайне сложно его пройти без того, кто этот путь уже прошёл.
- Комьюнити. Несмотря на кажущуюся асоциальность типичных айтишников, комьюнити решает. У меня будто появлялась дополнительная ответственность перед ребятами, которые учились со мной. И это не давало возможности уводить фокус от обучения.
- операции над элементом массива за его пределами или над пустым элементом
- чтение с недоступного каталога или неправильного адреса URL
- ввод недопустимых данных пользователем
- Abstract Window Toolkit (AWT)
- Swing
Java 6
Релиз версии состоялся 11 декабря 2006 года. Изменена официальная индексация — вместо ожидаемой 6.0 версия значится как 6. Минорные изменения как и в Java 5.0 вносятся в обычные обновления версии, например Java Standart Edition Development Kit 6 Update 27. Внесены следующие изменения:
Java 7
Релиз версии состоялся 28 июля 2011 года [20] . В финальную версию Java Standart Edition 7 не были включены все ранее запланированные изменения. Согласно плану развития (план «Б») [21] , включение нововведений будет разбито на две части: Java Standart Edition 7 (без лямбд, проекта Jigsaw, и части улучшений Coin) и Java Standart Edition 8 (все остальное), намеченный на конец 2012 года.
В новой версии, получившей название Java Standart Edition 7 (Java Platform, Standard Edition 7), помимо исправления большого количества ошибок было представлено несколько новшеств. Так, например, в качестве эталонной реализации Java Standart Edition 7 использован не проприетарный пакет JDK, а его открытая реализация OpenJDK, а сам релиз новой версии платформы готовился при тесном сотрудничестве инженеров Oracle с участниками мировой экосистемы Java, комитетом JCP (Java Community Process) и сообществом OpenJDK. Все поставляемые Oracle бинарные файлы эталонной реализации Java Standart Edition 7 собраны на основе кодовой базы OpenJDK, сама эталонная реализация полностью открыта под лицензией GPLv2 с исключениями GNU ClassPath, разрешающими динамическое связывание с проприетарными продуктами. К другим нововведениям относится интеграция набора небольших языковых улучшений Java, развиваемых в рамках проекта Coin, добавлена поддержка языков программирования с динамической типизацией, таких как Ruby, Python и JavaScript, поддержка загрузки классов по URL, обновленный XML-стек, включающий JAXP 1.4, JAXB 2.2a и JAX-WS 2.2 и другие [22] .
За 5 дней до выхода релиза Java Standart Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом [23] .
Список нововведений
Пространство имён
Идея пространств имён воплощена в Java-пакетах.
Пример программы
Пример использования аннотаций:
Основные идеи
Примитивные типы
В языке Java только 8 примитивных (скалярных, простых) типов: boolean, byte, char, short, int, long, float, double. Существует также вспомогательный девятый примитивный тип — void, однако переменные и поля такого типа не могут быть объявлены в коде, а сам тип используется только для описания соответствующего ему класса, для использовании при рефлексии. Кроме того, с помощью класса Void можно узнать, является ли определённый метод типа void : Hello.class.getMethod(«main», Array.newInstance(String.class, 0).getClass()).getReturnType() == Void.TYPE .
Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причем в Java, в отличие от других языков, он не является беззнаковым. Типы float и double могут иметь специальные значения
,
и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY , Double.NEGATIVE_INFINITY , Double.NaN ; для типа float — так же, но с приставкой Float вместо Double. Минимальные положительные значения, принимаемые типами float и double, тоже стандартизованы.
| Тип | Длина (в байтах) | Диапазон или набор значений |
|---|---|---|
| boolean | 1 в массивах, 4 в переменных [36] | true, false |
| byte | 1 | −128..127 |
| char | 2 | 0..2 16 −1, или 0..65535 |
| short | 2 | −2 15 ..2 15 −1, или −32768..32767 |
| int | 4 | −2 31 ..2 31 −1, или −2147483648..2147483647 |
| long | 8 | −2 63 ..2 63 −1, или примерно −9.2·10 18 ..9.2·10 18 |
| float | 4 | -(2-2 −23 )·2 127 ..(2-2 −23 )·2 127 , или примерно −3.4·10 38 ..3.4·10 38 , а также , , NaN |
| double | 8 | -(2-2 −52 )·2 1023 ..(2-2 −52 )·2 1023 , или примерно −1.8·10 308 ..1.8·10 308 , а также , , NaN |
Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java. Тем не менее одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово strictfp , запрещающее повышение точности.
Преобразования при математических операциях
В языке Java действуют следующие правила:
Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в C++. [37]
Объектные переменные, объекты, ссылки и указатели
В языке Java имеются только динамически создаваемые объекты. Причем переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть неявными указателями на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных. Так, в Java нельзя писать:
При присваиваниях, передаче в подпрограммы и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются адреса объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций разыменовывания — этот доступ осуществляется так, как если бы объектная переменная была самим объектом.
Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование, в частности:
Благодаря таким специально введенным ограничениям в Java невозможно прямое манипулирование памятью на уровне физических адресов (хотя ссылки, не указывающие ни на что, есть: значение такой ссылки обозначается null ).
Если нужен указатель на примитивный тип, используются классы-обёртки примитивных типов: Boolean , Byte , Character , Short , Integer , Long , Float , Double .
Дублирование ссылок и клонирование
Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать
то произойдет копирование адреса из переменной foo в переменную bar . То есть foo и bar будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная foo , будет менять объект, с которым связана переменная bar , и наоборот. Если же необходимо получить именно ещё одну копию исходного объекта, пользуются или методом (функцией-членом, в терминологии C++) clone() , создающим копию объекта, или (реже) копирующим конструктором (конструкторы в Java не могут быть виртуальными, поэтому экземпляр класса-потомка будет неправильно скопирован конструктором класса-предка; метод клонирования вызывает нужный конструктор и тем самым позволяет обойти это ограничение).
Метод clone() требует, чтобы класс реализовывал интерфейс Cloneable (об интерфейсах см. ниже). Если класс реализует интерфейс Cloneable , по умолчанию clone() копирует все поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод clone() . Определение и использование метода clone() часто является нетривиальной задачей. [39]
Сборка мусора
В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована сборка мусора. Традиционным [источник не указан 1120 дней] приёмом, дающим сборщику мусора «намёк» на освобождение памяти, является присваивание переменной пустого значения null . Это, однако, не значит, что объект, заменённый значением null , будет непременно и немедленно удалён, но есть гарантия, что этот объект будет удалён именно в будущем. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удален сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы.
Классы и функции
Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член» (англ. member function ), а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin() , а есть метод Math.sin() класса Math (содержащего, кроме sin() , методы cos() , exp() , sqrt() , abs() и многие другие). Конструкторы в Java не считаются методами. Деструкторов в Java не существует, а метод finalize() ни в коем случае нельзя считать аналогом деструктора.
Статические методы и поля
В Java (как и в C++) используются статические методы (англ. static method — в теории программирования их также называют методами класса), которые задаются при помощи ключевого слова static . Статические поля (переменные класса) имеют тот же смысл, что и в C++: каждое такое поле является собственностью класса, поэтому для доступа к статическим полям не требуется создавать экземпляры соответствующего класса.
Например, математические функции, реализованные в классе Math , представляют собой как раз статические методы данного класса. Поэтому можно писать
Поскольку статические методы существуют независимо от объектов (экземпляров класса), они не имеют доступа к обычным (нестатическим) полям и методам данного класса. В частности, при реализации статического метода недопустимо использовать идентификатор this .
Завершённость (final)
Ключевое слово final (финальный) означает разные вещи при описании переменной, метода или класса. Финальное поле класса инициализируется при описании, или в конструкторе класса (а статичное поле — в статичном блоке инициализации) и дальше его значение не может быть изменено. Значения локальных переменных, а также параметров метода, помеченных ключевым словом final, не могут быть изменены после присвоения. Но при этом, их значения могут использоваться внутри анонимных классов. Если статичное поле класса, или переменная проинициализированны константным выражением, они рассматриваются компилятором, как именованная константа; в таком случае их значение может быть использовано в операторах switch (для констант типа int), а также для условной компиляции (для констант типа boolean) при использовании с оператором if.
Метод класса, отмеченный словом final, не может быть переопределён при наследовании. Финальный класс не может иметь наследников вообще.
Абстрактность
В Java методы, не объявленные явно как static , final или private , являются виртуальными в терминологии C++: при вызове метода, по-разному определённого в базовом и наследующем классах, всегда производится проверка времени выполнения.
Абстрактным методом (модификатор abstract ) в Java называется метод, для которого заданы параметры и тип возвращаемого значения, но не тело. Абстрактный метод определяется в классах-наследниках. В C++ то же самое называется чисто виртуальной функцией. Для того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен быть описан как абстрактный. Объекты абстрактного класса создавать нельзя.
Интерфейсы
Высшей степенью абстрактности в Java является интерфейс ( interface ). Все методы интерфейса абстрактны: описатель abstract даже не требуется. Интерфейс в Java не считается классом, хотя по сути является полностью абстрактным классом. Класс может наследовать/расширять ( extends ) другой класс или реализовывать ( implements ) интерфейс. Кроме того, интерфейс может наследовать/расширять другой интерфейс.
В Java класс не может наследовать более одного класса, зато может реализовывать сколько угодно интерфейсов. Множественное наследование интерфейсов не запрещено, то есть один интерфейс может наследоваться от нескольких.
Интерфейсы можно передавать методам как параметры, но нельзя создавать экземпляры интерфейсов.
Маркерные интерфейсы
В Java есть некоторые интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM. Это интерфейсы:
Шаблоны в Java (generics)
Начиная с версии Java 5 в языке появился механизм обобщённого программирования — шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.
Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида <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 . Для каждого класса создаётся не более одного описывающего его объекта типа 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() (преобразует параметр в объект выбранного класса).
Что пишут на java? [закрыт]
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 4 года назад .
Я никак не понимаю, что я буду делать на работе, выучив джаву. Назовите, пожалуйста, примеры программ, к-е на ней чаще пишутся. Что я могу написать, чтобы показать работодателю? Я начала учить ее из интереса, интерес не пропадает, и вот подумалось мне: надо как нибудь использовать накопленные знания,и тут я поняла, что понятия не имею что, кого, чего. написание игр не интересует.
Что можно делать на Java? То же, что и на C, C++, Python, PHP, Ruby. Все, что придет в голову:
Много примеров. Хороший и полезный язык.
Далее взято из этого источника
Преимущества Java как языка программирования Объектно-ориентированный: в Java все является объектом. Дополнение может быть легко расширено, так как он основан на объектной модели.
Платформонезависимый: в отличие от многих других языков, включая C и C++, Java, когда был создан, он не компилировался в платформе конкретной машины, а в независимом от платформы байт-коде. Этот байт код распространяется через интернет и интерпретируется в Java Virtual Machine (JVM), на которой он в настоящее время работает.
Простой: процессы изучения и введение в язык программирования Java остаются простыми. Если Вы понимаете основные концепции объектно-ориентированного программирования, то он будет прост для Вас в освоении.
Безопасным: методы проверки подлинности основаны на шифровании с открытым ключом.
Архитектурно-нейтральным: компилятор генерирует архитектурно-нейтральные объекты формата файла, что делает скомпилированный код исполняемым на многих процессорах, с наличием системе Java Runtime.
Портативный: архитектурно-нейтральный и не имеющий зависимости от реализации аспектов спецификаций — все это делает Java портативным. Компилятор в Java написан на ANSI C с чистой переносимостью, который является подмножеством POSIX.
Прочный: выполняет усилия, чтобы устранить ошибки в различных ситуациях, делая упор в основном на время компиляции, проверку ошибок и проверку во время выполнения.
Многопоточный: функции многопоточности, можно писать программы, которые могут выполнять множество задач одновременно. Введение в язык Java этой конструктивной особенности позволяет разработчикам создавать отлаженные интерактивные приложения.
Интерпретированный: Java байт-код переводится на лету в машинные инструкции и нигде не сохраняется. Делая процесс более быстрым и аналитическим, поскольку связывание происходит как дополнительное с небольшим весом процесса.
Высокопроизводительный: введение Just-In-Time компилятора, позволило получить высокую производительность.
Распространенный: предназначен для распределенной среды интернета.
Динамический: программирование на Java считается более динамичным, чем на C или C++, так как он предназначен для адаптации к меняющимся условиям. Программы могут выполнять обширное количество во время обработки информации, которая может быть использована для проверки и разрешения доступа к объектам на время выполнения.
Зачем мне Java: неудобные вопросы о популярном языке и ответы на них
Мы собрали список распространённых вопросов о Java, а за ответами обратились к экспертам из Java Mentor. Смотрите, что из этого получилось.
1. Что пишут на Java: сферы применения языка
2. А насколько востребованы Java-разработчики?
Широта применения языка обеспечивает Java стабильно лидирующие позиции в рейтинге языков программирования TIOBE. Традиционно Java входит в топ-3 самых популярных языков программирования. Эта тенденция сохранится и в 2021 году. Во многих крупных компаниях (особенно в финансовой и банковской сферах) софт, написанный на Java, нуждается в регулярной доработке и поддержке, спрос на специалистов тут особенно велик. Плюс сохраняется тренд на развитие автоматизации и тестирования, и здесь Java в топе.
По данным Hays, снижения числа вакансий и спрос на Java-разработчиков не предвидится в ближайшее время.
Стоит выложить резюме — и у тебя разрывается Телега, WhatsApp, почта и телефон, словно контакты отдали особо злым пранкерам. Наверное, это всё, что нужно знать о востребованности джавистов.
Очень востребованы: выкладываешь резюме, и телефон с электронной почтой переполняются сообщениями от HR, а даже если после закрыл резюме — пишут всё равно каждый день.
3. Java vs PHP: на чём писать бэкенд?
Разницу можно описать одним предложением. У этих языков разная специфика применений: если нужно что-то крупное — Джава, если мелкий сайт — подойдёт PHP.
PHP отлично подходит для написания простеньких веб-проектов, вроде опенкарт, магазинов и т. д. Мелкий сайтик проще, быстрее и дешевле написать на PHP. Для небольших веб-проектов PHP хорош тем, что порог входа ниже, язык сам по себе проще, и реализовать задачу быстрее. Но он слабо масштабируемый и работает медленнее Java, так как скриптовый.
На Java же порог вхождения выше, но он гораздо быстрее PHP за счёт того, что Java — компилируемый язык и легко масштабируется, что позволяет писать огромные системы из миллионов строк кода, в итоге нагрузку держит лучше.
Поэтому если нужно что-то кроме мелкого веб-сайта, то стоит смотреть в сторону Java. Ну, и Java — строго типизированный язык, отчего код более читаемый, а это дополнительный плюс к масштабируемости.
4. Функциональное программирование в Java: плюсы и минусы
5. Сколько зарабатывают Java-разработчики?
Средняя зарплата Java-разработчика в Москве составляет около 150 тыс. руб. в месяц (до вычета НДФЛ). Зарплаты таких специалистов растут каждый год на 5–10%.
Что касается мировых показателей, то, по данным Stack Overflow, средняя зарплата Java-программиста составляет 120 тыс. долларов в год.
6. С чего начать изучение Java?
Тут нет однозначного рецепта успеха. Кому-то заходят видосики, но мне такой подход показался неудобным. Чтобы был толк, весь представленный в видеоуроках код нужно написать самому, а это крайне неудобно делать, перематывая видео туда-сюда. До этого всё нужно посмотреть от начала до конца, чтобы вникнуть в суть происходящего целиком. На это уходит очень много времени.
Просто решать задачки на JavaRush — тоже не выход. Их космическая сага не повествует о самых базовых концепциях, не раскрывает суть самих задач.
Лучший вариант, на мой взгляд, начать с книги Шилдта «Полное руководство Java». Там есть теоретические выкладки, которые сложны для понимания в русском варианте, но если не лениться, самому модернизировать код из каждого примера, понимание сути изложенного придëт. Я остановился в изучении по данной книге только тогда, когда дошëл до графических интерфейсов Swing и JavaFx. Не сказать, чтобы я стал экспертом, но это позволило мне в будущем быстро находить интересующую информацию по Java Core в уже понятном мне варианте изложения.
7. Каков кратчайший путь с нуля до Junior Java-разработчика?
В первую очередь не надо позиционировать себя как Junior-разработчик. Все хотят, чтобы к ним на работу пришёл человек, готовый решать боевые задачи. Поэтому важно, во-первых, иметь реальный опыт командной разработки. Вы можете его получить на каких-то платных ресурсах, либо на бесплатных. Или просто собраться с друзьями и заняться командной разработкой. Очень важно, чтобы вы имели реальный проект, про который можете рассказать на собеседовании.
Во-вторых, нужно заниматься по 5-6 часов каждый день, минимум. Если вы занимаетесь меньше, скорее всего, ваш путь затянется на год, два, а может вообще никогда не закончится.
В-третьих, неважно, какой у вас бэкграунд, есть он вообще или нет. Самый короткий путь — это делать ровно то, что нужно для трудоустройства, и не закапываться в темы. Очень часто при самостоятельном обучении студенты закапываются в темы глубже, чем надо. Эта одна из популярных ошибок новичков. Сфокусируйтесь на главном и бейте в эту точку.
Для меня не работало чтение книг и сложных статей, но отлично подошёл вариант с решением задач на JavaRush до 15–18 уровня с ежедневной регулярностью. Одного-двух месяцев хватит, чтобы набить руку и перестроить мышление на лад программирования.
Дальше курс на Степике, порешать в свободное время все задачи, а потом уже идти в Java Mentor. Там уже решать чёткие поставленные задачи, не закапываясь слишком глубоко: есть задача — есть решение, есть вопросы — есть ответы. И так до подготовки к собеседованиям, где ребята из JM также помогли понять, какие темы самые популярные на собесах, и что углубляться нужно именно в них. Очень помогала коммуникация и дух соревнования с одногруппниками.
Заключение
Посматриваете в сторону Java-разработки? Верное решение. Исходя из представленных вопросов и ответов по Java, этот язык применяется во многих сферах, а потому джависты — востребованные высокооплачиваемые ребята, и в ближайшем будущем ситуация вряд ли изменится.
Вооружайтесь советами менторов и выпускников из JM и вперёд — покорять вершины, а полноценный курс по Java в этом сильно поможет.
Что было написано на java
Java — объектно-ориентированный язык программирования, выпущенный компанией Sun Microsystems в 1995 году как основной компонент платформы Java. Сейчас языком занимается компания Oracle, которая приобрела Sun Microsystems в 2009 году. Синтаксис языка во многом похож на C и C++. В официальной реализации, Java приложения компилируются в байт-код, который при выполнении интерпретируется виртуальной машиной для конкретной платформы.
Oracle предоставляет компилятор Java и виртуальную машину Java, которые удовлетворяют спецификации Java Community Process, под лицензией GNU General Public License.
Язык значительно позаимствовал синтаксис с C и C++. В частности, взята за основу объектная модель С++, однако ее модифицировали. Устранена возможность появления некоторых конфликтных ситуаций, которые могли возникнуть из-за ошибки программиста. Ряд действий, которые в С/C++ должны осуществлять программисты, поручены виртуальной машине. Прежде, Java разрабатывалась как платформо-независимый язык, поэтому она имеет меньше низкоуровневых возможностей для работы с аппаратным обеспечением. При необходимости таких действий Java позволяет вызывать подпрограммы, написанные на других языках программирования.
Java повлияла на развитие J++, который разрабатывался компанией Microsoft. Работа над J++ была остановлена из-за судебного иска компании Sun Microsystems, поскольку этот язык программирования был модификацией Java. Позже в новой платформе Microsoft.NET появился J#, облегчающий миграцию программистов J++ или Java на новую платформу. Со временем новый язык программирования С#, стал основным языком платформы, переняв многое из Java. J# включался в версию Microsoft Visual Studio 2005. Язык сценариев JavaScript имеет схожее с Java название и синтаксис, но не связан с Java.
Содержание
История [ править ]

Язык программирования Java зародился в 1991 г. в лабораториях компании Sun Microsystems. Разработку проекта начал Джеймс Гослинг, сам проект назывался «Green» (Зеленый). Создание первой рабочей версии, которая называлась «Oak» (дуб), заняло 18 месяцев. Поскольку оказалось, что имя Oak уже использовалось другой фирмой, то в результате длительных споров вокруг названия нового языка среди ряда предложенных было выбрано название Java [1] , в 1995 году язык был официально переименован. [2]
Главным мотивом создания Java была потребность в языке программирования, которая не зависела от платформы (то есть от архитектуры) и которую можно было бы использовать для создания программного обеспечения, которое встраивается в различные бытовые электронные приборы, такие как мобильные средства связи, устройства дистанционного управления и тому подобное.
Довольно скоро почти все популярные тогдашние браузеры получили возможность запускать «безопасные» для системы Java-апплеты внутри веб-страниц. В декабре 1998 года Sun Microsystems выпустила Java 2, где было реализовано несколько конфигураций для различных типов платформ. Например, J2EE предназначалась для создания корпоративных приложений, а значительно урезана J2ME для приборов с ограниченными ресурсами, таких как мобильные телефоны.
13 ноября 2006 года Sun выпустили большую часть Java в качестве свободного и открытого программного обеспечения в соответствии с условиями GNU General Public License (GPL). 8 мая 2007 года корпорация закончила процесс, в результате которого все исходные коды Java были выпущены под GPL, за исключением небольшой части кода, на который Sun не было авторского права.
Период становления Java совпал по времени с расцветом международной информационной службы World Wide Web. Это обстоятельство сыграло решающую роль в будущем Java, поскольку Web тоже требовала платформо-независимых программ. Как следствие, были смещены акценты в разработке Sun из бытовой электроники на программирование для Интернета.
Платформа Java [ править ]
Под «независимостью от архитектуры» имеется в виду то, что программа, написанная на языке Java, может работать на любой поддерживаемой аппаратной или системной платформе без изменений в исходном коде и перекомпиляции.
Этого можно достичь, компилируя начальный Java-код в байт-код, который представляет собой упрощенные машинные команды. Затем программу можно выполнить на любой платформе, имеет установленную виртуальную машину Java, которая интерпретирует байт-код в код, приспособленный к специфике конкретной операционной системы и процессора. Сейчас виртуальные машины Java существуют для большинства процессоров и операционных систем.
Стандартные библиотеки обеспечивают общий способ доступа к таким платформозависимым особенностям, как обработка графики, многопоточность и работу с сетями. В некоторых версиях для увеличения производительности JVM байт-код можно компилировать в машинный код до или во время выполнения программы.
Основное преимущество использования байт-кода — это портативность. Тем не менее, дополнительные расходы на интерпретацию означает, что интерпретированы программы будут почти всегда работать медленнее, чем скомпилированные в машинный код, и именно поэтому Java получила репутацию «медленного» языка. Однако, этот разрыв существенно сократился после введения нескольких методов оптимизации в современных реализациях JVM.
Одним из таких методов является англ. just-in-time (JIT) компиляция, которая превращает Java байт-код в машинный при первом запуске программы, а затем кэширует его. В результате, такая программа запускается и выполняется быстрее, чем простой интерпретированный код, но ценой дополнительных затрат на компиляцию во время выполнения. Сложные виртуальные машины также используют динамическую перекомпиляцию, которая заключается в том, что ВМ анализирует поведение запущенной программы и выборочно рекомпилирет и оптимизирует некоторые ее части. С использованием динамической рекомпиляции можно достичь большего уровня оптимизации, чем за статической компиляции, поскольку динамический компилятор может делать оптимизации на базе знаний об окружающей среде периода выполнения и о загружены классы. К тому же, он может обнаруживать так называемые горячие точки — части программы, чаще всего внутренние циклы, которые занимают больше всего времени при выполнении. JIT-компиляция и динамическая рекомпиляция увеличивает скорость Java-приложений, не теряя при этом портативности.
Существует еще одна технология оптимизации байт-кода, широко известная как статическая компиляция. Этот метод предполагает, как и традиционные компиляторы, непосредственную компиляцию в машинный код. Это обеспечивает хорошие показатели по сравнению с интерпретацией, но за счет потери переносимости: скомпилированную таким способом программу можно запустить только на одной, целевой платформе.
Скорость официальной виртуальной машины Java значительно улучшилась с момента выпуска ранних версий, к тому же, некоторые испытания показали, что производительность JIT компиляторов по сравнению с обычными компиляторами в машинный код почти одинакова. Однако эффективность компиляторов не всегда свидетельствует о скорости выполнения скомпилированного кода, только тщательное тестирование может выявить истинную эффективность в данной системе.
Обьектность [ править ]
В противоположность C++, Java — объектно-ориентированный язык. Все данные и действия группируются в классы объектов. Исключением из полной объектности является примитивные типы (int, float и т. д.). Это было сознательным решением проектировщиков языка для увеличения скорости. Поэтому, Java не считается полностью объектно-ориентированным языком.
В Java все объекты являются производными от главного объекта (он называется просто Object), из которого они наследуют базовую поведение и свойства.
Хотя в C++ впервые стало доступно множественное наследование, но в Java возможно только одинарное наследование, благодаря чему исключается возможность конфликтов между членами класса (методы и переменные), которые наследуются от базовых классов.
Безопасность [ править ]
В намерениях проектировщиков Java была заменить C++ — объектного преемника языка C. [3] Проектировщики начали с анализа свойств C++, которые являются причиной наибольшего числа ошибок, чтобы создать простой, безопасный и безотказный язык программирования.
В Java существует система обработки исключительных ситуаций, например:
Одна из особенностей концепции виртуальной машины заключается в том, что ошибки (исключения) не приводят к полному краху системы. Кроме того, существуют инструменты, которые «присоединяются» к среде периода исполнения и каждый раз, когда произошло определенное исключение, записывают информацию из памяти для отладки программы. Эти инструменты автоматизированной обработки исключений предоставляют основную информацию о исключений в программах на Java.
Однако, язык программирования Java не рекомендуется использовать в системах, сбой в работе которых может привести к смерти, травмам или значительных физических повреждениям (например, программное обеспечение для управления атомными электростанциями, полетами, системами жизнеобеспечения или системами вооружения) из-за ненадежности программ, написанных на языке программирования Java. [4]
Автоматическое управление памятью [ править ]
Java использует автоматический сборщик мусора для управления памятью во время жизненного цикла объекта. Программист решает, когда создавать объекты, а виртуальная машина ответственная за освобождение памяти после того, как объект становится ненужным. Когда к определенному объекту уже не остается ссылок, сборщик мусора автоматически убирать его из памяти. Однако, утечка памяти все же может произойти, если код, написанный программистом, имеет ссылки на уже ненужные объекты, например на объекты, хранящиеся в действующих контейнерах.
Сбор мусора разрешен в любое время. В идеале оно происходит во время бездействия программы. Сборка мусора автоматически форсируется при недостатке свободной памяти в куче для размещения нового объекта, что может приводить к кратковременному зависанию. Поэтому существуют реализации виртуальной машины Java с уборщиком мусора, специально созданным для программирования систем реального времени.
Java не имеет поддержки указателей в стиле C/C++. Это сделано для безопасности и надежности, чтобы позволить сборщику мусора перемещать объекты.
Структура Java-приложения [ править ]

Программы на Java образованы из классов и интерфейсов. Классы содержат переменные и константы, которые содержат данные, методы, которые выполняют действия, и конструкторы, которые создают экземпляры классов — объекты. Данные могут получить тип (например байт, целое число, символ) или быть ссылкой на объект. Язык Java является статически типизированным.
Лексическая структура [ править ]
Java-программы записываются в кодировке Unicode, также предоставляется лексическое преобразование, которое позволяет записывать символы Юникода руководящими кодами Unicode с помощью только множества символов ASCII. Язык Java представляет текст последовательностями 16-битных кодовых единиц, используя кодирование UTF-16. За исключением комментариев, идентификаторов и содержания символьных и строчных литералов, все входящие элементы программы на Java состоят из символов ASCII или соответствующих им руководящих кодов Unicode.
Типы данных [ править ]

Java является строго типизированным языком, каждая переменная и выражение имеет тип, известный на этапе компиляции.
Типы данных Java принадлежат к двум категориям: простые (primitive) и определителю (reference). К простым типов принадлежит логический (логический) тип, числовые типы и символьный тип.
Числовые типы состоят из целых типов byte, short, int, long и действительных типов float, double. Символьный тип представлен типом char. Определителю типа состоят из классов, интерфейсов, массивов. Значением вказивникового типа есть указатель на объект — экземпляр класса или массива. Строки являются объектами класса String.
Критика [ править ]
Критика Java касается заимствования синтаксиса из C/C++ , использование обобщений, быстродействия, обработки чисел без знака, реализации вычислений чисел с плавающей точкой, больших массивов и др.
Использование другими компаниями [ править ]
Google [ править ]
При создании Android (операционной системы с открытым кодом) Google взяла за основу Java. Несмотря на то, что операционная система, построенная на ядре Linux, была написана в основном на C , Android SDK использует Java для разработки приложений для платформы Android.
7 мая 2012 года суд Сан-Франциско обнаружил, что если API защищено авторским правом, то Google, используя Java в Android, нарушает авторские права Oracle. [5] Был поднят вопрос о правовом статусе использования Java в Android-устройствах. Однако, уже 31 мая того же года федеральный судья США постановил, что API не могут быть защищены авторским правом. [6]
Графический интерфейс пользователя [ править ]
Для реализации графического интерфейса (GUI) в Java существуют два основных пакета классов: [7]
Преимуществами первого является простота использования, интерфейс подобен интерфейсу операционной системы и несколько лучше быстродействие, поскольку базируется на средствах ОС, правда имеет ограниченный набор графических элементов. Второй пакет Swing реализует собственный Java-интерфейс. Этот пакет создавался на основе AWT, и имеет гораздо больше возможностей и большее количество графических элементов. [8] Swing-компоненты еще называют облегченными, поскольку они написаны полностью на Java и, поэтому, платформонезависимы.
Существуют также сторонние пакеты, самым популярным является Standard Widget Toolkit — стандартный инструментарий виджетов. Разработанный подразделением Rational фирмы IBM и компанией Object Technology International (OTI), сейчас развивается фондом Eclipse.
, NaN