Когда у меня был только HelloWorld.java в каталоге без HelloWorld.class, java HelloWorld в Windows cmd вызвал исключение класса, не найденного. Однако java HelloWorld.java было выполнено правильно, без создания HelloWorld.class.
Насколько я понимаю, JVM читает байт-коды файла с расширением .class, но не может прочитать файл .java. Я понимаю, что java.exe — это всего лишь средство запуска для создания JVM и ее запуска, но теперь я не понимаю, как он может правильно работать с Java-кодом, а не с байт-кодом.
Написал статью некоторое время назад о попытке опробовать JEP-330 и краткое изложение того, что это могло означать. Открыт для обратной связи, чтобы улучшиться :)




В современной Java для удобства начинающих студентов Java-приложение компилирует, а затем запускает файл .java.
Думайте об этом как о том, что Java-приложение обнаруживает файл исходного кода, затем передает работу по компиляции Javac-приложению, кэширует скомпилированный класс в памяти и, наконец, продолжает запускать вновь скомпилированный класс.
JDK поставляется в комплекте с несколькими десятками инструментов. Несколько из них имеют решающее значение:
.java файл текста исходного кода в .class файл байт-кода..class файл, запустив JVM.Этапы процесса:
.java, включая метод main внутри определения class..class.main, запуская Java-приложение, входящее в состав каждого JDK.Вы можете пропустить некоторые шаги.
.java. Java-приложение сначала автоматически скомпилируется, как если бы от вашего имени вызывался javac. Затем Java-приложение запустит вновь скомпилированный класс.
.class не записывается в хранилище. Скомпилированный класс кэшируется в памяти.java HelloWorld.java был выполнен правильно без создания HelloWorld.class.mainjava без объявления класса. Просто напишите только метод main, ничего вокруг него.public static из объявления метода main.Команда Java прилагает согласованные усилия, чтобы облегчить путь начинающим Java-программистам и сгладить первоначальные препятствия. Они пытаются замаскировать некоторые сложные церемонии и сделать инструменты более дружелюбными и удобными.
Базовые структуры и функции Java по-прежнему сохраняются. Это не «отупление» Java. Эти усилия — всего лишь попытки создать разумные условия для новичков.
Объединив эти функции, начать работу с приложением Hello World очень просто: достаточно записать следующую команду в файл HelloWorld.java:
void main() {
System.out.println("Hello, World!");
}
… а затем в командной строке вызовем:
java HelloWorld.java
Результат на консоли:
Привет, мир!
Это огромное сокращение трудозатрат и путаницы для новичка, изучающего Java.
Кстати... Еще один способ упростить использование Java — это jshell , REPL для Java.
Как новички, так и профессионалы находят jshell удобным для запуска коротких фрагментов Java с немедленной обратной связью.
Еще один полезный инструмент для начинающих — BlueJ , IDE, предназначенная для студентов.
Как упоминалось в JEP-330, для вашего примера.
java HelloWorld.java
неформально эквивалентно
javac -d <memory> HelloWorld.java
java -cp <memory> hello.World
эквивалентно, если hello.World — это имя первого класса, найденного в файле HelloWorld.java.
Начиная с Java 9, у нас есть jshell инструменты REPL для языка Java (REPL как в Python), интерактивный интерпретатор исходного кода Java.
Начиная с Java 11, вы можете либо выполнять байт-код JVM, либо интерпретировать исходный код Java (режим исходного файла) с помощью команды java (см. https://openjdk.org/jeps/330). Выдержка из этого документа:
Начиная с JDK 10, средство запуска Java работает в трех режимах: запуск файла класса, запуск основного класса файла JAR или запуск основной класс модуля. Здесь мы добавляем новый, четвертый режим: запуск класс, объявленный в исходном файле.
Как работает переводчик? Это (почти) не представляет интереса, но весьма вероятно, что некоторые этапы компиляции выполняются «под капотом».
из документации инструмента
java: «Если класс идентифицирует существующий файл с расширением .java или если указан параметр --source, то выбирается режим исходного файла. Затем исходный файл компилируется и запускается ... В режиме исходного файла эффект такой, как будто исходный файл скомпилирован в память», (выделено мной)