Как работают java программы

Эта книга написана разработчиками языка Java и является полным техническим справочником по этому языку программирования. В ней полностью описаны новые возможности, добавленные в Java SE 8, включая лямбда-выражения, ссылки на методы, методы по умолчанию, аннотации типов и повторяющиеся аннотации. В книгу также включено множество поясняющих примечаний. В ней четко обозначены отличия формальных правил языка от практического поведения компиляторов.

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

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

02 — Как работает Java приложение? Что такое JVM, JRE, JDK? — Уроки Java для начинающих

Язык программирования Java — язык относительно высокого уровня, что проявляется, в частности, в том, что детали представления машинного кода в языке недоступны.

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

Язык не включает ни одной небезопасной конструкции, такой как доступ к массиву без проверки диапазонов индексирования, поскольку такие небезопасные конструкции могут приводить к неопределенному поведению программы.

Программа на языке Java обычно компилируется в набор команд байт-кода и бинарный формат, определенный в спецификации виртуальной машины Java The Java Virtual Machine Specification, Java SE 8 Edition.

Источник: www.kavserver.ru

Язык Java изнутри

В языке Java, как и во многих других языках программирования, для создания программы вы пишете исходный код, затем компилируете его; компилятор проверяет соответствие вашего кода синтаксическим правилам языка. Java-платформа добавляет еще один шаг к этому процессу. После компиляции Java-кода получаются байт-коды. Виртуальная машина Java (JVM) затем интерпретирует эти байт-коды во время исполнения — то есть тогда, когда вы запускаете Java-программу.

С точки зрения файловой системы при написании кода вы создаете файл с расширением .java. После компилирования этого файла компилятор Java создает файл с расширением .class, который содержит байт-коды. JVM читает и интерпретирует этот файл во время исполнения, и то, как она делает это, зависит от платформы, на которой вы работаете.

Для работы на других платформах вы должны откомпилировать ваш исходный код с библиотеками, специфичными для этой платформы. Как вы понимаете, обещание «Write Once, Run Anywhere» (написать один раз, запускать везде) превращается в высказывание «Write Once, Test Anywhere» (написать один раз, проверить везде). Существуют тонкие (или не такие тонкие) отличия платформ, которые могут вызвать различное выполнение вашего кода на различных платформах.

Зачем нужен final класс в Java? #Shorts

Сборка мусора

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

Если вы писали какие-либо программы на языке программирования C++, который тоже является (вероятно) объектно-ориентированным, то знаете, что как программист вы должны распределять и освобождать память для ваших объектов явно при помощи функций malloc() и free() . Для программистов это обременительная задача. Она также и опасна, поскольку может привести к утечкам памяти в ваших программах. Утечка памяти — это ничто иное, как ваша программа, поглощающая оперативную память с угрожающей скоростью, что нагружает процессор машины, на которой работает ваша программа. Java-платформа освобождает вас от каких-либо беспокойств по этому поводу, поскольку она имеет так называемый сборщик мусора .

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

Читайте также:
Правообладатель программы для эвм это

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

IDE против инструментов командной строки

Как мы уже отмечали ранее, Java-платформа поставляется с инструментами командной строки, которые позволяют компилировать ( javac ) и запускать ( java ) Java-программы. Так зачем же тогда использовать такую IDE как Eclipse? Причина этого заключается в том, что использование инструментов командной строки может стать головной болью для работы с программами любой сложности. Они имеются под рукой, когда необходимы, но использование IDE в большинстве ситуаций является более мудрым решением.

Главной причиной использования IDE является управление файлами и путями в самой IDE и наличие мастеров, помогающих вам при необходимости изменить вашу среды времени исполнения. Если я хочу откомпилировать Java-программу при помощи инструмента командной строки javac , то должен заранее побеспокоиться об установке переменной среды CLASSPATH , для того чтобы JRE смог найти мои классы, либо я должен установить эту переменную во время компилирования. В такой IDE как Eclipse все, что я должен сделать — это указать Eclipse, где найти мою JRE. Если мой код использует классы, которые я не написал, все что я должен сделать — это указать Eclipse библиотеки, на которые ссылается мой код, и их месторасположение. Это намного проще, чем использование командной строки для ввода ужасно длинных строк, указывающих classpath.

Если вы хотите или вынуждены использовать инструменты командной строки, то можете найти дополнительную информацию по их использованию на Web-сайте Sun по Java-технологии.

Источник: kvodo.ru

Java для начинающих. Часть 1 из 4

Java

Данные статьи помогут легко и быстро разобраться в концепциях и программировании на Java.

Даже при нулевых знаниях о программировании на Java трудностей в освоении этих материалов не возникнет. А опытные Java-разработчики смогут освежить свои знания.

JVM, JRE и JDK

Вот так и происходит вся магия: логика (т.е. код) прописывается в java файле, который затем преобразуется в файл класса. Машина его читает и выполняет.

А теперь подробнее:

  • JVM — виртуальная машина Java, выполняющая байт-код Java.
  • JVM можно загружать на разном железе. Байт-коды — это машинный язык JVM. Поэтому Java является самым портируемым языком. JVM — это некий объект, который и обеспечивает портируемость. Для разных операционных систем (Mac, Windows, Linux и т.д.) придуманы свои реализации JVM.
  • JRE — среда выполнения Java, достаточная для запуска программы.
  • JRE = JVM + файлы библиотеки/пакеты классов (Util, Lang, Math etc).
  • JDK — пакет средств разработки на Java. Нужен для написания, компиляции и выполнения программы.
  • JDK = JRE + инструменты, необходимые для разработки Java-программы.

Выделение памяти

Коротко о том, как происходит выделение памяти со стороны кода в фоновом режиме:

  • Каждый раз при создании объекта в Java он сохраняется в heap памяти.
  • Примитивы и локальные переменные хранятся в stack памяти, переменные-члены — в heap.
  • При многопоточности каждый поток имеет собственный stack, но находится в общей куче (heap). О многопоточности поговорим во второй части.
  • При вызове какого-либо метода все методы и переменные помещаются в stack. По завершении вызова указатель стека (stack) уменьшается.
  • 32-разрядная операционка тратит не более 4GB RAM на Java-приложения. В 64-разрядной затраты памяти на те же элементы увеличиваются вдвое.
  • Примитивный тип int тратит в 4 раза меньше памяти, чем Integer.

Таблица ниже перечисляет различные типы данных и их диапазоны хранимых значений:

ООП — Инкапсуляция, наследование, полиморфизм и абстракция

Объектно-ориентированное программирование (ООП) — это концепция программирования, основанная на 4 базовых принципах.

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

Инкапсуляция — это объединение данных и функциональных средств в единый компонент. Функциональные средства — это «методы», а данные — это «переменные». Все они объединяются в «класс». Это некая схема или набор инструкций.

Класс — это некий прообраз или прототип, который определяет переменные и методы. Пример:

Класс: Машина Переменные-члены или объекты: цвет, тип, модель и т.д. Методы: остановка, ускорение, предельная скорость.

Объект — это экземпляр класса. В примере выше моя машина будет экземпляром общего класса Машина.

Переменные: локальные, статические и переменные экземпляра. Локальные переменные объявляются в теле метода. Переменные экземпляра объявляются вне метода и являются специфичными для конкретного объекта. Статические переменные инициализируются только один раз при запуске программы. Статические переменные инициализируются первыми, но об этом чуть позже.

Читайте также:
Как редактировать видео без программ

Методы— это различные функциональные средства. То есть, не что иное, как набор кода, на который поименно ссылаются или вызывают из любой части программы. Вы передаете несколько значений в метод и он их возвращает.

Пакет— это набор связанных классов. Используется для организации классов в структуру папок, а также для быстрого нахождения и повторного использования этих классов.

package com.example; class Car < String color = «black»; //instance variable void accelerate() < int speed = 90; //local variable >>

2. Абстракция

Абстракция — это выбор данных из большого пула по определенным критериям объекта. Ниже показаны различные модификаторы доступа и то, как они ограничивают данные из класса.

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

Наследование — это процедура, при которой один класс приобретает свойства другого. Например, потомок наследует признаки своего родителя.

class Developer < public void writeCode()< // writeCode method >class BackendDeveloper extends Developer < public void writeCode()< // writeCode method >> Class run < public static void main (String args[])< Developer developerObject = new Developer() // writeCode method in class Developer will be executed developerObject.writeCode(); BackendDeveloper backendDeveloperObj = new BackendDeveloper(); // writeCodemethod in class BackendDeveloper will be executed backendDeveloperObj.writeCode(); >>

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

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

  • Перегрузка — это несколько методов одного класса с одним именем, но разной сигнатурой.
  • Переопределение — два метода (один в родительском классе, другой — в дочернем) с одним именем и сигнатурой.
  • Метод подкласса переопределяет метод суперкласса.
  • При переопределении подклассов модификатор доступа должен быть больше родительского класса. Например, если использовать public abc() в родительском классе и private abc() в подклассе — это вызовет исключение.

Загрузка статического и динамического класса

  • Добавление класса для запуска в JVM называется загрузкой класса.
  • Классы загружаются статично с помощью нового оператора.
  • Первый класс загружается через метод static main(). Затем подгружаются остальные классы.
  • В серверных проектах отсутствует main(), поскольку сервер сам отвечает за всю инфраструктуру. Первый класс для загрузки отмечается в config файле. Довольно часто фреймворк реализует метод main() и предоставляет API. Пример: Контейнерный класс вызывает метод init() в сервлетах.
  • main нужен для запуска Java-программы из командной строки в JVM.
  • Если при загрузке статического класса не находится ссылка на класс, то выбрасывается NoClassDefinationFoundException.
  • Динамические классы загружаются через программный вызов при выполнении. Пример: Class.forName(String ClassName);
  • ClassNotFoundException выбрасывается при загрузке динамического класса.

Абстрактный класс и интерфейс

  • В интерфейсе отсутствует код реализации, а все методы являются абстрактными. То есть, все методы объявляются, но ни один не определяется.
  • В абстрактном классе есть исполняемые и абстрактные методы.
  • Класс реализует сколько угодно интерфейсов, но расширяет только один абстрактный класс.
  • Методы абстрактного класса могут быть или не быть абстрактными.
  • Абстрактный класс не может превратиться в экземпляр, но может стать подклассом.
  • Все абстрактные методы должны определяться в подклассе, то есть, подкласс является абстрактным.
  • Создавать экземпляры из интерфейса нельзя. Их можно реализовывать в других классах или расширять другими интерфейсами.
  • Переменные интерфейсов конечные и статические. По умолчанию, все методы интерфейса публичные и абстрактные.
  • Интерфейс не может содержать реализацию и не может превращаться в подкласс. Все переменные должны быть постоянными.

Java Packages

Ниже даны примеры библиотек из пакетов Java которые помогут при написании правильного кода. О них мы еще поговорим.

Конструкторы

  • Их единственная цель — создавать экземпляры класса. Они вызываются в процессе создания объекта класса.
  • Если конструктор с аргументами определен в классе, то нельзя будет работать со стандартным конструктором без аргументов (no-argument constructor) — придется их прописать.
  • Java не поддерживает конструктор копирования.
  • Имя конструктора и класса совпадает.
  • Если конструктор вызывается из другого конструктора с синтаксисом this, то речь идет именно об этом объекте.
  • В Java есть стандартный конструктор.

Приватный конструктор:

  • Защищает класс от явного превращения в экземпляр.
  • Построение объекта возможно только внутри конструктора.
  • Используется в шаблоне «Одиночка» (Singleton).

Вопрос: Можно ли синхронизировать конструкторы в Java?

Нет. В Java запрещен многопоточный доступ к конструкторам объекта, поэтому необходимость в синхронизации отсутствует.

Вопрос: Наследуются ли конструкторы? Может ли подкласс вызывать конструктор родительского класса?

Конструкторы не наследуются. При переопределении конструктора суперклассов нарушается инкапсуляция языка. Конструктор родительского класса вызывается ключевым словом super.

Читайте также:
Работает ли программа по переселению с севера

Static

  • Модификатор Static используется для создания чего-то в единственном экземпляре. Например, когда мы хотим создать переменную или объект, доступные для всех объектов класса.
  • Static необходим для передачи информации по всем объектам.
  • Static подходит для переменных, методов и блоков.
  • или переменные принадлежат классу, а не объекту.
  • Статичный метод или переменная инициализируются один раз перед переменной экземпляра.
  • Статичный метод или переменная могут вызываться напрямую из имени класса. Пример: .
  • Статичный метод имеет доступ только к статичным данным.
  • Статичный метод не может ссылаться на this или super.
  • Статичный метод может вызывать только другие статичные методы.
  • main () — это статичный метод. Он должен быть доступен приложению до создания экземпляров.
  • Конструктор не бывает статичным, потому как компилятор считает его методом. Кроме того, конструктор нужен для инициализации нового объекта, а static выполняет совершенно противоположную функцию.
  • Статичная переменная загружается первой. После нее идет статичный блок. И очередность здесь важна. Статичные методы загружаются в конце.

Статичный родитель → Статичный потомок → Экземпляр родитель → Конструктор родитель → Экземпляр потомок → Конструктор потомок.

  • При переопределении статичного метода компилятор не выдает ошибок. Но правильнее это называть не переопределением, а скрытием, т.к. пропадают все плюсы полиморфизма.

Final, Finalize и Finally

  • Ключевое слово final указывает на неизменность значения чего-либо.
  • Класс final не расширяется.
  • Метод final не переопределяется.
  • Переменные final равнозначны константам.
  • Блок finally вызывается для всех блоков try-catch и используется для очистки системных ресурсов, будь то подключения, выражения и т.д. Мы еще поговорим о них подробнее.
  • Метод finalize() помогает высвобождать память. Он вызывается перед тем, как сборщик мусора помещает объект на удаление.

Класс Object

В каждом классе есть суперкласс Object. В нем присутствуют следующие не конечные методы:

  • equal()
  • hashCode()
  • toString()
  • clone()
  • finalize()

Конечные методы суперкласса:

  • wait()
  • notify()
  • notifyAll()
  • getClass()

Equals и hashСode

  • Методы equals() и hashСode() переопределяются для сравнения двух объектов.
  • Метод equal() выполняет сравнение, а метод hashCode возвращает хеш-код.

Clone

  • Метод сlone нужен для копирования объекта.
  • В методе clone присутствует защищенный модификатор доступа.
  • Для вызова метода clone объекту требуется реализация интерфейса Cloneable. В противном случае выбрасывается исключение CloneNotSupportedException.
  • Интерфейс Cloneable является маркерным, то есть методы не определяют интерфейс, а говорят классу об особом отношении.
  • Плюс такого интерфейса: можно копировать только объекты, доступные для клонирования.
  • Если какое-то поле объекта ссылается на другой объект, то делаем поверхностную копию. В ней копируется только адрес памяти, т.е. используется один и тот же объект.
  • При глубоком копировании происходит создание объекта и новое динамическое распределение памяти.

Public Object Clone()< Try< Return super.clone(); >> Public Object Clone()< Try< Object obj = (Object) super.clone(); Return obj; >>

Не обращайте внимание на оператора try — к нему мы вернемся позже.

Агрегация и композиция

  • Агрегация выражает отношение is a («являться чем-то»). Пример: дом является зданием.
  • Композиция выражает отношение has a («быть частью чего-то»). Пример: в доме имеется ванная. То есть форма отношения, в котором эта часть не может существовать без остальных элементов.
  • Агрегация — это более слабое отношение. Композиция намного сильнее.
  • Как правило, агрегация достигается расширением класса. Для композиции нужна реализация интерфейса.

Примитивы и оболочки типов

Переменная примитивного типа всегда содержит его значение. В Java существует 8 примитивных типов: byte , short , int , long , char , boolean , float and double .

Класс-оболочка — это класс, объект которого оборачивает или содержит примитивные типы данных. При создании объекта в классе-оболочкепоявляется поле для хранения примитивных типов данных, а также других поддерживающих и операционных методов. Если использовать не сами примитивы, а Object-оболочки для примитивных типов данных, то процесс выполняется медленнее. Дополнительные ресурсы тратятся на создание экземпляра объекта, вызовы методов и т.д. За каждым из этих примитивных типов закреплен свой класс: Byte, Short, Integer, Long, String, Boolean, Float и Double.

Автоупаковка и распаковка

  • Компилятор Java 1.5 автоматически преобразует примитивы к оболочкам типов, то есть выполняет автоупаковку. Обратное действие называется распаковкой.
  • Для этого в компиляторе используется valueOf() и intValue().

Кастинг

  • Это присвоение значение другому примитиву.

byte → short → int → long → float → double

  • В Java возможно и восходящее преобразование (upcasting):

int i = 5; long j = i;

  • Нисходящее преобразование (downcasting) невозможно, т.к. требуется прямой кастинг:

long j = 5; int i = j; (THIS IS WRONG, it will give classCastException) int i = (int) j;

  • Преобразование int в String также невозможно.

Источник: nuancesprog.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru