Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
56.75 Кб
Скачать

Значение Java cегодня

Java - (на момент написания данной заметки) - один из самых популярных языков программирования (в ряде версий рейтингов - самый популярный). Пожалуй, это основная причина по которой его стоит изучать =)

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

По мнению Герберта Шилдта основная причина успеха Java - его быстрое развитие от версии к версии и "способность" (естественно, благодаря разработчикам) быстро подстраиваться под современные нужды программистов.

История создания. Начало

Всё началось в 1991 году, когда группа инженеров из компании Sun (кстати, именно в этой компании появился другой знаковый проект - MySQL) под руководством Патрика Нотона и Джеймса Гослинга занялась разработкой небольшого языка, который можно было бы использовать для программирования бытовых устройств, например, контроллеров для переключения каналов кабельного телевидения.

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

Идея от Pascal =)

Стремясь изобрести небольшой, компактный и машинонезависимый код, разработчики возродили модель, использованную при реализации первых версий языка Pascal заре эры персональных компьютеров. Никлаус Вирт, создатель языка Pascal, в свое время разработал машинонезависимый язык, генерирующий промежуточный код для некоей гипотетической машины.

Этот язык стал коммерческим продуктом под названием UCSD Pascal. (Такие гипотетические машины часто называются виртуальными — например, виртуальная машина языка Java, или JVM.) Этот промежуточный код можно выполнять на любой машине, имеющей соответствующий интерпретатор. Инженеры, работавшие над проектом "Green", также использовали виртуальную машину, что решило их основную проблему.

Идея от C++

Но сотрудники Sun имели опыт работы с UNIX и вообще - знали, что такое "промышленная разработка", потому в основу синтаксиса Java они положили C++, а не Pascal. В частности, они сделали язык объектно-, а не процедурно-ориентированным.

Название - почему и от чего

Сначала Джеймс Гослинг решил назвать его "Oak" = "Дуб" (первая реализация имела место в 1992 году) - возможно потому, что он любил смотреть на дуб, растущий прямо под окнами его офиса в компании Sun.

Однако потом сотрудники компании Sun узнали, что слово Oak уже используется в качестве имени ранее созданного языка программирования, и в 1995 изменили название на Java (также некоторые легенды сообщают, что Java вроде как звучит ярче и маркетологи посоветовали изменить название).

Язык назван в честь марки кофе Java, которая, в свою очередь, получила наименование одноимённого острова (Ява), поэтому на официальной эмблеме языка изображена чашка с парящим кофе:

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

Рассвет =)

Одним из главных факторов "обнаруживаемости" Java в первых версиях (по мнению Г. Шилдта) был взрывообразный рост популярности сети Интернет - и, как следствие, появления потребности создания платформонезависимых приложений.

В 1993 разработчик Java (тогда ещё Oak - почему см. выше) понимают, что Интернет, как и микроволновки (и кофемашины) требует кроссплатформенности - и взялись за дело. Именно Интернет обеспечит в дальнейшем успех Явы в мире программистов и, как следствие, - пользователей.

Влияние на интернет

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

Затем появляются так называемые сервлеты - Java начинает оккупировать сервера, становясь всё более "универсальной" - вот-вот и на ней и впрямь начнут программировать электрические чайники! (обычное уже давно программируют =)

Мобильные люди

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

Особенности устройства Java - движемся дальше

Самое время рассказать о том как работают программы на Java

Приложение

Таблица - развития языка от версии к версии

?

Версия     Количество классов и интерфейсов   Количество методов и полей

 

1.0        212                                2125

 

1.1        504                                5478

 

1.2        1781                               20935

 

1.3        2130                               23901

     

1.4        3020                               32138

Виртуальные машины счастья

Как уже было сказано в заметке об истории - программа на Яве компилируется не в машинный код для данного процессора а в так называемый код виртуальной машины Java (Java Virtual Machine - JVM)

Данный приём не способствует повышению производительности, зато обеспечивает упрощённую реализацию столь желанной переносимости программ (для разработчиков языка, для прикладных же программистов и код является абсолютно универсальным для все платформ).

Также виртуальная машина позволяет контролировать исполняемый код и таким образом обезопасить остальные программы в системе. Для некоторого увеличения производительности существует компилятор JIT (Just in time - часть JVM), который позволяет "на лету" компилировать фрагменты программы в исполняемый код платформы. При этом компиляция всей программы оказывает нецелесообразной - так как Java выполняет ряд проверок именно во время исполнения.

При использовании JIT безопасность (изолированность) кода программы сохраняется - ибо JVМ "продолжает" следить за ним =))

Обещания

Ява обещает вам некоторые собственные свойства - так это или нет мы узнаем дальше, а пока всё же упомянем о них:

  1. Простота - для кто что-то когда-то программировал изучение Java должно пройти легко и приятно

  2. Безопасность - это мы обсуждали выше и раньше, и возможно вернёмся в дальнейшем.

  3. Переносимость - уже обсуждали - является центральной идеей создания Явы

  4. Объектная ориентированность - одно из немногих свойств Явы, в котором мало кто сомневается =) -хотя тем не менее примитивы остались примитивами (их, к счастью, не сделали объектами) - что положительно сказалось на производительности

  5. Устойчивость - проверка кода явы происходит не только во время компиляции, но и во время выполнения - так что можно сказать, что Ява - это "предсказуемый" язык. Ява сама управляет памятью (это избавляет нас от первого рода проблем) -ну и второй камень преткновения - это процесс обработки исключений, который в яве поставлен "как надо" - и фактически предоставлен удобный механизм поставки под контроль исключительных ситуаций - они могут и должны обрабатываться.

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

  7. Архитектурная нейтральность - Г. Шилдт указывает в этом пункте прежде всего на то, что программы "написанные однажды, должны выполняться всегда" - не зависить о ОС и иных особенностей

  8. Интерпретируемость - это правда =) Java - интерпретируемый язык

  9. Высокая производительность - Jit конечно есть, но не всегда помогает

  10. Распределённый характер - как было сказано ранее, Ява - подстраивался под нужды Интернет - в частности были созданы средства "прозрачного" для прикладного программиста обращения к удалённым файлам, и более того - средства удалённого вызова методов (Remote Method Invocation - RMI)

  11. Динамический характер - ява довольно мощно контролирует программу на этапе выполнения, а потому в памяти оказывается куча дополнительной информации - но это оправдано так как проводятся проверки полномочий доступа к объектам во время выполнения ,а также динамическое связывание кода, которое "технически оправдано".

Эволюция Java - развитие во времени.

Именно благодаря собственному оперативному развитию Java занимает сегодня лидирующие позиции среди популярных языков программирования. Разница между версиями 1.0 и 1.1 уже была значительной, а Java 2.0 открывает "современную эру" Явы =)

Концепции

Как было сказано выше, Java является объектно-ориентированным языком, в связи с чем мы временно оставим эту страницу и поговорим об ООП.

Выделяют два основных подхода к программированию:

  • ориентированный на процессы

  • ориентированный на данные

Примером подхода ориентированного на процесс (функциональность) является так называемое процедурное программирование (например, язык Pascal - Паскаль), а примером подхода, ориентированного на данные - объектно-ориентированный подход, например в Java.

Ранее мы говорили, о двух возможных подходах, теперь рассмотрим подробнее ООП.

Предположим, что мы программируем систему, моделирующую космический корабль в некотором пространстве. Что он может? Он может:

  1. Разгоняться

  2. Тормозить

  3. Открывать и закрывать солнечные паруса

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

Но что если нам необходимо поддержать замену парусов одного типа на паруса другого типа? Конечно - мы можем написать соответствующую функцию, но хранить значения о том какие именно паруса используются опять же придётся в переменных -равно как и все специальные характеристики частей корабля, если они обладают некоторым функционалом, влияющим на состояние нашей модели (например, весом) - это весьма неудобно. Хочется изменить сам подход к построению программы - и вот тут то нам и приходит на помощь ООП.

ООП

ООП - объектно-ориентированное программирование, относится к типу походов построения языка (а обычно стиль поддерживается именно на уровне языка - то есть в языке например должно быть что-то вроде зарезервированного слова для объявления класса), ориентированных на данные.

Наш космический корабль - это объект, который в исходном коде программы описывается классом , у него есть:

  1. Поля - это значения (переменные класса), которые можно менять как непосредственным обозначением так и через вызов методов (см. ниже) - в них мы можем ранить все необходимые данные - скорость, суммарную массу, название корабля, имя капитана и т.д.

  2. Методы - это функции (подпрограммы) ,которые могут работать как с внешними данными (например считать путь до звезды по её координатам, которые передаются на наш корабль с Земли - то есть извне) , так и с данными самого класса - то есть, например, функция управляющая парусом может править значение скорости, которое мы договорились хранить в соответствующем поле.

Паруса, двигатель -и даже капитан - теперь тоже могут быть объектами - и эти объекты мы можем и будем хранить (вернее - ссылки на них, подробнее о типах смотри здесь) в полях класса "Корабль" ,просто задав им соответствующий тип.

Тип класса обычно описывается отдельно (не на месте объявления) - после того как он описан можно объявить поле соответствующего типа.

Вывод

Таким образом мы представили нашу систему в виде совокупности (в частности - иерархии ,как как например объект "двигатель" входит в объект "корабль") объектов и теперь можем поговорить об основных принципах ООП.

Для того, чтобы моделировать корабль было проще а развивать его легче придумали несколько принципов. Разные люди выделяют разное их количество - но большинство в этом смысле - минималисты и горит это большинство о трёх основных принципах ООП:

  1. Инкапсуляция

  2. Наследование

  3. Полиморфизм

Все три принципа используются вместе, позволяя создавать изящные решения в рамках ООП-подхода.

Если вы попали сюда, читая о Яве, то продолжайте движение в эту сторону =)

Инкапсуляция

Инкапсуляция - принцип ООП, в соответствии с которым любой класс может должен рассматривать как чёрный ящик, при этом оставляя "видимым" для пользователя только свою интерфейсную часть (то есть известно "что" можно сделать, но на процесс исполнения "пользователь" повлиять не может).

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

Здесь следует упомянуть про понятие "СОКРЫТИЕ ДАННЫХ" -также являющуюся одновременно как неотъемлимой частью ООП, так и логическим продолжением инкапсуляции. Фактически - это управление областью видимости переменной.

Наследование - один из принципов ООП - означает возможность получения свойств объектом-потомком от родительского объекта, средствами описания их классов в программном коде.

В основе наследования лежит прежде всего иерархичность понятий, осознаваемых человеком, например:

?

1

Военная машина -> Танк  -> Российский Танк  ->  Т-72

Это пример нисходящей иерархии понятий, под которые можно начать программировать классы, например "Боевая машина" может иметь поле "тип" - и это поле наследуют все её "дети" -то есть у Т-72 тоже будет поле "тип".

Кстати, мы можем и разветвить иерархию понятий начианая с определённого уровня - например:

?

1

Военная машина -> Танк  -> Американский танк  ->  Абрамс

Новый функционал

Классы-наследники могут иметь и дополнительные (свои) функции, но все реализованные функции родителей становятся автоматически доступными в классах-наследниках.

Пример синтаксиса

То что один класс наследуется от другого указывается с помощью специальных слов (или слова), например (язык PHP, пример на Java ищите здесь):

?

/* базовый класс - от него мы будем наследоваться*/

class Component

{

    public function Operation1()

    {

        /* просто вернём строку */

        return 'у меня только одна операция!';

    }

}

 

/* extends - слово с помощью которого "расширяют"

    класс ( наследуются и вводят что-то новое)*/

class ConcreteComponent extends Component

{

    /* у нас уже есть одна операция - давайте определим ещё одну*/

    public function Operation2()

    {

        /*тоже вернём строку */

        return 'У меня две операции!, хотя в коде описана только моя собственная';

    }

}

Полиморфизм - явление , при котором функции(методы) с одним и тем же именем ("поли" = "единичный") соответствуют различные кодовые реализации.

Если "в целом": полиморфизм это возможность использовать один интерфейс (в общем смысле этого слова) для разных реализаций - не уточняя как именно это произошло, в общем случае (если говорить про все вообще языки программирования) полиморфизм не является следствием наследования, а является "самостоятельным" принципом ООП.

Когда возникает полиморфизм

Полиморфизм в том числе возникает в случае, если сравнить родительский объект и производный от него: явление возникает в случае, если в классе-потомке переопределяется реализация метода с сохранением его сигнатуры функции - то есть особенностей её объявления. - такая ситуация называется "переопределением" метода.

Ещё возможна ситуация, когда в одном классе существуют два метода с одинаковыми именами но, но разными сигнатурами - и как следствие - разными реализациями (иначе зачем одинаковые реализации)(обычно они различаются порядком и/или типом передаваемых значений) - такая ситуация тоже является случаем полиморфизма и называется перегрузкой методов

Итак, мы говорили о двух случаях возникновения полиморфизма:

  1. переопределение метода (полиморфизм в сравнении с объектом родителем или же в сравнении с другим потомком такого же родителя но с другой реализацией, например унаследованной от родителя)

  2. перегрузка метода (здесь полиморфизм возникает даже в рамках одного класса - так как реализация разная, а вот "интерфейс", который в данном случае представлен просто сигнатурой каждой функции - т.е. два интерфейса одинаковы в общем смысле - т.к. одинаковы имена функций, а вот реализации различны)

Конструктор - специальные метод, в ООП языках, который вызывается при создании класса - в него могут передаваться параметры для конфигурации класса перед использованием.

Во многих языках один из конструкторов (их может быть несколько) всегда вызывается сразу же после создания объекта

(пример) Примеры:

  1. Конструктор в Яве

  2. Конструктор в Си++

Java - конструктор класса

В Яве (как и в других языках) существуют так называемые конструкторы классов - выполняют они ту же роль, что и в других языках, то есть служат для конфигурации объекта при его создании.

Итак - конструктор, это метод, который вызывается в самом начале жизненного цикла объекта и "не возвращает" значения. Общая схема:

?

1

public имякласса(список_параметров){}

причём:

  1. списка параметров может не быть

  2. имя конструктора совпадает по написанию с именем класса

  3. слово public - не обязательно

Имя метода-конструктора совпадает с именем класса, конструкторов может быть несколько - и различаются они числом или типом передаваемых параметров, давайте добавим несколько конструктров в уже известный нам класс Car:

?

public class Car {

     

    int height; // высота

    int width; // ширина

       

     

    public Car(){ // (без параметров) переопределяет стандартный конструктор

        height = 25;

    }

     

    public Car(int w){ // получает один параметр

        width = w;

    }

     

    public Car(int w, int h){ // получает 2 параметра

        width = w * 2;

        height = h * 5;

    }

}

Каждый из трёх конструкторов по-разному настраивает поля класса.

Пример использования:

?

1

2

3

Car mycar = new Car(); // height == 25

Car mycar2 = new Car(11);  // width == 11

Car mycar3 = new Car(3, 7);

Сигнатура (функции) -- что это в программировании

Сигнатура функции - это описание её заголовка, в которое обычно входят:

  1. имя функции

  2. число и тип и порядок следоваения передаваемых в неё параметров

  3. тип возвращаемого значения

Например сигнатура конструктора в Си++ (отсюда):

?

1

CPU (char* design,int freq)

показывает, что метод получает один параметр типа char* и один параметр типа int - при этом функция никаких значений не возвращает (слева от CPU тип возвращаемого значения не указан)

Класс - что это в программировании

Класс - в программе это специально размеченный фрагмент кода, который отражает свойства объекта из некоторой моделируемой системы.

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

Классы используются прежде всего в ООП подходе к программированию и содержат поля и методы.

Примеры классов

  • в Яве

  • в Си++

Классы и объекты

Класс -- схема для построения объекта, при его создании.

Интерфейс - что это такое

Общее понятие (общий смысл)

Интерфейсом называется совокупность доступных методов (функций) (обычно - с учётом их сигнатур) - то есть известно, что они есть, но детали их реализации не важны - в наиболее общим случае может подразумеваться совокупность имён этих функций.

Интерфейс класса

Так, например, интерфейсом класса называют совокупность всех его методов

Интерфейс как структура в ООП

В ООП можно объявлять так называемые интерфейсы (пример для явы см. здесь) - специально отмеченные фрагменты кода, которые описывают необходимые функции - их возвращаемые значения и типы передаваемых в них данных. Интерфейсы используются как "образцы" - для создания классов.

Если класс реализует интерфейс то он объявляет внутри себя методы - с такими же именами и сигнатурами как у интерфейса описывает как именно их реализовывать.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]