с каким расширением хранится исходный код классов а с каким скомпилированный java

Создание, компиляция и выполнения Java программ

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

Для создания и редактирования исходного кода Java вы можете использовать любой текстовый редактор или IDE. Этот раздел демонстрирует, как создавать, компилировать и запускать программы Java из командной строки. В разделе «Компиляция и запуск Java программ в NetBeans» показано, как это делать в IDE на примере NetBeans.

Можно вообще обойтись без IDE, а писать исходный код в любом текстовом редакторе (например, в Notepad), а компилировать в командной строке.

с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть фото с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть картинку с каким расширением хранится исходный код классов а с каким скомпилированный java. Картинка про с каким расширением хранится исходный код классов а с каким скомпилированный java. Фото с каким расширением хранится исходный код классов а с каким скомпилированный java

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

должен называться Welcome.java, поскольку имя public класса – Welcome.

Компилятор Java преобразовывает файл с исходным кодом Java в файл с байткодом Java. Следующая команда компилирует Welcome.java:

Если нет синтаксических ошибок, компилятор генерирует файл байкода с расширением .class. Следовательно, приведённая выше команда генерирует файл с названием Welcome.class.

Чтобы иметь возможность компилировать и запускать программы, вы должны установить JDK. Как это сделать описано в инструкциях:

Язык Java – это высокоуровневый язык программирования, но байткод Java – это низкоуровневый язык. Байткод похож на машинные инструкции, но нейтрален к архитектуре (не зависит от архитектуры) и может запускаться на любой платформе, которая имеет виртуальную машину Java – Java Virtual Machine (JVM). В отличие от физической машины, виртуальная машина – это программа, которая интерпретирует байткод Java. Это одно из главных преимуществ Java: байткод Java может работать на различных аппаратных платформах и операционных системах. Исходный код Java компилируется в байткод Java, а байткод Java интерпретируется виртуальной машиной Java. Ваш код Java может использовать код библиотеки Java. JVM выполняет ваш код вместе с кодом из библиотеки.

Выполнить Java программу – это значит запустить байткод программы. Вы можете выполнить байткод на любой платформе с JVM, которая является интерпретатором. Она (виртуальная машина Java) переводит отдельные инструкции байткода в целевой машинный языковой код. Это делается последовательно – одна инструкция за раз, а не вся программ за один присест. Каждый шаг немедленно выполняется, сразу после перевода.

Следующая команда выполняет байткод для программы, которая приведена выше:

На скриншоте ниже показан процесс компиляции и запуска:

с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть фото с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть картинку с каким расширением хранится исходный код классов а с каким скомпилированный java. Картинка про с каким расширением хранится исходный код классов а с каким скомпилированный java. Фото с каким расширением хранится исходный код классов а с каким скомпилированный java

Внимание: не используйте расширение .class в команде, когда запускаете программу. Используйте ИмяКласса для запуска программы. Если вы в командной строке используете ИмяКласса.class, то система будет пытаться работать с файлом ИмяКласса.class.class.

Справка: когда выполняется Java программа, JVM начинает с загрузки байткода класса в память, используя программу под названием загрузчик классов (class loader). Если ваша программа использует другие классы, загрузчик классов динамически подгружает их перед тем, как они понадобятся. После загрузки класса, JVM использует программу под названием контролёр байткода (bytecode verifier) для проверки правильности байткода и проверки, что байткод не нарушает ограничений безопасности Java. Java обеспечивает строгую защиту, чтобы убедиться, что файлы классов Java не подделаны и не вредят вашему компьютеру.

Педагогическое примечание: ваш инструктор может требовать от вас использовать пакеты для организации программ. Например, все программы из этой части можно поместить в пакет chapter2. Подробности о пакетах и пространствах имён будут рассмотрены далее. Также посмотрите раздел «Почему NetBeans всегда использует package».

Типичные ошибки компиляции и запуска Java программ

Команда javac не найдена

Если при запуске javac, т.е. при попытке компиляции Java программы вы получаете ошибку:

Это означает, что JDK не установлен. Либо установлен, но не настроены переменные окружения. Способы исправления очевидны:

Если JDK установлен, то можно обойтись без добавления переменной окружения. Для этого используйте абсолютный путь до исполнимого файла javac:

Ошибка Class names are only accepted if annotation processing is explicitly requested

Если попытаться скомпилировать программу следующим образом:

то возникнет ошибка:

Причина ошибки в том – что вы забыли указать расширение файла .java.

Ошибка записи (error while writing)

Компиляция заканчивается ошибкой:

Ошибка «class is public, should be declared in a file named»

который заканчивается примерной такой ошибкой

означает, что вы неправильно назвали класс в исходном коде программы. Имя класса должно совпадать с именем файла. В данном случае файл называется Welcome.java, а класс внутри программы назван Welcomee

Error: Could not find or load main class

Если попытаться запустить программу следующим образом:

то возникнет ошибка

Причина её в том, что не нужно было добавлять к названию файла расширение .class. Виртуальная машина автоматически добавляет расширение и в приведённом примере она ищет файл Welcome.class.class

Ошибка Error: Could not find or load main class при запуске Java программы по абсолютному пути

Эта ошибка возможно при запуске Java программы по абсолютному пути:

Ошибка возникает как в Windows, так и в Linux:

Если в терминале вы находитесь в той же директории, что и файл, который вы запускаете, то не нужно указывать абсолютный путь. Например, нужно запускать так:

с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть фото с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть картинку с каким расширением хранится исходный код классов а с каким скомпилированный java. Картинка про с каким расширением хранится исходный код классов а с каким скомпилированный java. Фото с каким расширением хранится исходный код классов а с каким скомпилированный java

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

с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть фото с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть картинку с каким расширением хранится исходный код классов а с каким скомпилированный java. Картинка про с каким расширением хранится исходный код классов а с каким скомпилированный java. Фото с каким расширением хранится исходный код классов а с каким скомпилированный java

Как видно из скриншота, командная строка находится в папке C:\WINDOWS\system32. Файл, который нам нужно запустить, находится в папке C:\ (корень диска). Мы указываем после ключа -cp папку C:\, а затем пишем имя файла программы без расширения – Welcome.

Аналогично нужно поступать в Linux. Пример команды:

Ошибка Main method not found in class

Если при запуске вы столкнулись с ошибкой:

Это означает, что вы не указали метод main, либо написали слово неправильно (например, Main вместо main).

Особенности компиляции и запуска Java программ в Windows

Команда «javac» не является внутренней или внешней командой, исполняемой программой или пакетным файлом

Эта ошибка рассмотрена чуть выше. Для установки и настройки переменных окружения в Windows обратитесь к инструкции «Установка Java (JDK) в Windows».

Проблема с кодировкой в Java программах в командной строке Windows

Если вы написали программу, которая выводит кириллицу в консоль:

А в качестве результата получили крякозяблы:

с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть фото с каким расширением хранится исходный код классов а с каким скомпилированный java. Смотреть картинку с каким расширением хранится исходный код классов а с каким скомпилированный java. Картинка про с каким расширением хранится исходный код классов а с каким скомпилированный java. Фото с каким расширением хранится исходный код классов а с каким скомпилированный java

Значит кодировка, в которой выводит строки ваша программа, отличается от кодировки командной строки Windows.

Имеется несколько способов исправить эту проблему. Кстати, если для запуска консольных программ Java вы используете NetBeans, то он выводит строки в правильной кодировке. В Linux эта проблема также отсутствует. Если вам нужно поменять кодировку на время, то вы можете выполнить следующие команды:

Для того, чтобы смена кодировки командной строки Windows не сбрасывалась после закрытия и открытия командной строки, можно внести изменения в реестр Windows. Для этого нажмите Win+x, выберите «Выполнить», в открывшееся окно введите regedit. В открывшейся программе (редактор реестра Windows) перейдите к [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun] и измените (или добавьте) значение на @chcp 65001>nul

Источник

Зона кода

Предлагаю вниманию читателей статью, написанную давно — в 2012 году. Зачем ей пылиться на винчестере? Пусть лучше пылится на сайте, решил я.

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

Когда писалась статья, во дворе свирепствовала 7-я версия языка Java. Сейчас, в феврале 2018-го года, за окном уже вовсю резвится 9-я версия. Но, полагаю, что вся информация, изложенная в статье, справедлива, всё же, и для последней версии языка, хоть я этого и не проверял (а надо бы проверить). Ведь обычно, насколько я помню, совместимость программ, написанных на старых версиях, с новыми компиляторами сохранялась.

Статья адресована новичкам. Но и мне самому она, полагаю, будет полезна, если я решусь вернуться к языку Java после многолетнего перерыва в работе с ним. Пожалуй, именно информация о структуре программ на Java будет для меня наиболее полезна в случае такого возвращения, поскольку она наиболее сильно, по сравнению с остальными элементами языка, «затёрлась» в моей голове.

Всю информацию я попытался изложить достаточно подробно, и в то же время, систематично.

Итак, передаю слово себе самому 6-летней давности.

Вступление

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

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

В связи с этим вспоминаю случай из моего педагогического прошлого. Студентка, изучавшая язык Java под моим чутким руководством, благополучно сдала зачёт за семестр. А во втором семестре выяснилось, что девушка не умеет компилировать и запускать программы из командной строки. Оказалось, что ранее она пользовалась NetBeans’ом, который выполнял всю работу по сборке и выполнению приложений за неё. И при этом она успешно написала полтора десятка не самых простых программ!

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

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

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

Один файл — один класс

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

Для запуска программы на выполнение необходимо вызвать команду java (интерпретатор) с именем запускаемого класса в качестве параметра, например:

В результате начнётся выполнение метода main() запускаемого класса ( Alpha в нашем примере).

Компиляция одного класса в одном файле (щёлкните для увеличения)

Один файл — несколько классов

В одном файле может содержаться несколько классов. В этом случае имя файла (без расширения) должно совпадать с именем любого из этих классов.

Компиляция нескольких классов в одном файле (щёлкните для увеличения)

Несколько классов в нескольких файлах

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

Скомпилировать такую программу можно, запустив команду javac с параметрами, совпадающими с именами файлов, разделённых пробелами, например:

javac Alpha.java Beta.java Gamma.java

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

Компиляция нескольких классов в нескольких файлах (щёлкните для увеличения)

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

Если такие классы не используются, то будут скомпилированы только классы, код которых имеется в этом файле.

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

Ну а если компилятору не удалось найти ни исходный код классов, ни их байтовый код, то наш единственный файл он компилировать не будет, а вместо этого выведет сообщение об ошибке.

Заметим, что область поиска файлов передаётся компилятору через параметры (но это не единственный вариант). Данному вопросу будет посвящён отдельный раздел статьи. Если же компилятор «не знает», где искать файлы, то поиск он осуществляет в той директории, в которой находится наш компилируемый файл (затем поиск продолжается в том месте, где хранится стандартная библиотека Java; об этом мы ещё поговорим подробнее).

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

Классы, помещённые в пакеты

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

Пакеты имеют имена (из этого правила имеется исключение, речь о котором пойдёт ниже). Имя подпакета — это обычный идентификатор языка Java. Часто также говорят о полном имени пакета. Если пакет не является подпакетом, то его полное имя совпадает с его именем. Полное имя подпакета представляет собой полное имя пакета, содержащего данный подпакет, за которым следует точка и имя этого подпакета.

Полное имя класса состоит из полного имени пакета, в котором этот класс содержится, за которым следует точка и имя класса. Например, если файл Alpha.java имеет следующую структуру:

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

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

Во-первых, если класс вложен в пакет, то скомпилированный код класса должен находиться в каталоге, имеющим то же самое имя, что и пакет. Если этот пакет вложен в некоторый другой пакет, то каталог, одноимённый с внутренним пакетом, нужно поместить в каталог, одноимённый с внешним пакетом и т. д., т. е. иерархии пакетов, вложенных друг в друга, должна соответствовать иерархия одноимённых каталогов, также вложенных друг в друга.

В-третьих, при запуске файла на выполнение нужно указывать полное имя класса. В нашем примере для выполнения класса Alpha (мы предполагаем, что он содержит метод main() ) нужно воспользоваться следующей командой:

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

Команду для запуска класса Alpha мы уже приводили:

Компиляция класса, вложенного в иерархическую структуру пакетов (щёлкните для увеличения)

Заметим, что мы могли бы поместить программу и в текущий каталог, если бы при компиляции передали ключу в качестве параметра точку:

Мы можем без проблем скомпилировать файл Beta.java командой

а затем — Alpha.java :

Для чего нужны пакеты

Поддержка пакетов в Java имеет несколько положительных сторон.

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

Если же классы с одинаковыми названиями помещены в разные пакеты, то, при указании полных имён, конфликтов не возникает. Даже в рамках одной библиотеки может понадобиться создать классы с одинаковыми именами. Если поместить эти классы в разные пакеты, то проблем не возникнет.

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

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

Импорт классов

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

Заметим, что импорт классов, вложенных в некоторый пакет, не означает импорта классов из подпакета, который также вложен в данный пакет. Например, инструкция

Можно импортировать не все общедоступные классы пакета, а лишь отдельные классы. Для этого нужно использовать инструкцию в следующем формате:

Например, импорт общедоступного класса Alpha из пакета pack1.pack2.pack3 выглядит так:

Зададимся теперь вопросом: а что будет, если импортированы классы двух пакетов, в которых имеются общедоступные классы с одинаковыми именами? Ответ на этот вопрос достаточно прост. Если к этим классам мы не обращаемся в коде, то никаких проблем не возникнет. Но стоит нам обратиться к одному из них, так сразу же проблемы появятся. Компилятор не сможет определить, к какому именно классу мы обращаемся, поэтому он попросту откажется компилировать код и выдаст соответствующее сообщение о неоднозначности.

Стандартная библиотека

В распоряжении разработчика на языке Java имеется огромная библиотека классов и интерфейсов, являющейся частью платформы Java. Эта библиотека называется стандартной библиотекой или библиотекой Java API (application programming interface — интерфейс прикладного программирования). Классы и интерфейсы, входящие в библиотеку, распределены по пакетам.

Вот примеры, иллюстрирующие сказанное в предыдущих двух абзацах. Первый пример:

А вот второй пример:

Установка путей к классам

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

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

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

Байтовый код классов будет искаться в jar-архивах, содержащихся в директориях lib и lib\ext (здесь указаны относительные пути относительно каталога, в котором размещена JRE). Именно в этих директориях размещены скомпилированные классы стандартной библиотеки Java.

Пусть, например, в файле Example.java имеется следующий код:

Пусть также существует файл Message.java следующего содержания:

В результате выполнения команды на консоль будет выведено:

Компиляция двух файлов по-отдельности (щёлкните для увеличения)

Мы компилировали каждый из файлов Message.java и Example.java отдельно. Однако можно было скомпилировать сразу оба файла. Для этого достаточно выполнить только вторую из двух приведённых выше команд:

Теперь для запуска программы из директории Project достаточно указать лишь один каталог для поиска файлов:

Компиляция двух файлов одной командой (щёлкните для увеличения)

Обратите внимание на то, что при использовании ключа –classpath при вызове как компилятора, так и интерпретатора, в текущей директории поиск файлов с байтовым кодом, включая байтовый код запускаемого файла (при вызове компилятора), производиться уже не будет (если только текущая директория не прописана в параметре, передаваемом ключу ‑classpath ).

Для установки необходимо вызвать окно “Переменные среды” (в Window 7: “Пуск” → “Панель управления” → “Система” → “Дополнительные параметры системы” → “Переменные среды”). В нижней части окна расположена панель “Системные переменные”. Если в списке переменных CLASSPATH уже имеется, достаточно щёлкнуть по её имени в списке и отредактировать текстовое поле “Значение переменной” появившегося окна “Изменение системной переменной”.

Если переменная CLASSPATH в списке отсутствует, то её необходимо создать, щёлкнув по кнопке “Создать” нижней панели и введя имя и значение переменной в соответствующие текстовые поля появившегося окна “Новая системная переменная”.

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

Установка значения переменной CLASSPATH будет действительной только в данном сеансе работы командной оболочки.

Коротко об интерфейсах

Выводы

Если говорить короче, то программа (в обоих смыслах) — это набор пакетов, содержащих классы и интерфейсы.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *