Как запустить основной метод класса с использованием Java 11 - PullRequest
4 голосов
/ 10 мая 2019

У меня есть один файл исходного кода Test.java

class Test{
    public static void main(String args[]){
        System.out.println("works);
   }
}
java Test.java

Работает нормально. Если Test.java файл исходного кода имеет два класса, такие как Test и Test1

class Test {
    public static void m1(){
        System.out.println(" m1 ");
    }
}

class Test1 {
    public static void main(String args[]){
        System.out.println(" works ");
    }
}
java Test.java

Вышло исключение, что

ошибка: не удается найти метод main (String []) в классе: Test

Итак, есть ли способ компилировать и запускать Java-программу напрямую, которая имеет два класса?

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Я пытался, и это сработало. Если в одном файле исходного кода несколько классов, нам нужно поместить класс в начало исходного файла, который содержит основной метод (String args []).

0 голосов
/ 10 мая 2019

JEP 330 - запуск однофайловых программ с исходным кодом - одна из самых интересных функций в предстоящем выпуске JDK 11 (18.9). Эта функция позволяет выполнять исходный код Java напрямую с помощью интерпретатора Java. Исходный код компилируется в памяти, а затем исполняется интерпретатором. Ограничение состоит в том, что все классы должны быть определены в одном файле.

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

В этом посте я не буду вдаваться в подробности того, как реализована эта функция. Вместо этого я сосредоточусь на использовании этой функции, пробуя разные образцы. Начнем с самого простого, как обычно, примера: «Привет, мир!»

приведенный ниже код сохранен в файле HelloWorld.java.

public class HelloWorld{

    public static void main(String[] args){

        System.out.println("Hello World!!!");

    }

}

Я выполню приведенный выше код, как показано ниже.

F: \ java11 \ single-file> java HelloWorld.java

Hello World!!!

В приведенном выше примере есть только один класс, и он содержит метод main. При выполнении кода с использованием Java, мы должны передать ему имя файла, заканчивающееся расширением .java. Если имя файла не заканчивается расширением .java, тогда мы должны использовать опцию --source. Мы увидим это в следующем примере.

Параметры командной строки

Средство запуска Java представило новый режим исходного файла для поддержки этой функции. Режим исходного файла включается, если выполняется одно из следующих двух условий:

1. Первым элементом в командной строке, за которым следуют параметры JVM, является имя файла с расширением .java. 2. Командная строка содержит параметр –source version.

Если файл не соответствует стандартным соглашениям об именах для исходных файлов Java, нам нужно использовать параметр –source. Подробнее о таких файлах мы поговорим в следующем разделе.

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

Например, у нас есть файл с именем Addition.java, который содержит класс Addition. Этот класс содержит метод main(), который вычисляет сумму его аргументов:

java Addition.java 1 2 3

Файлы Шебанга

В системах на основе Unix, таких как macOS и Linux, часто используется директива «#!» Для запуска исполняемого файла сценария.

Например, скрипт оболочки обычно начинается с:

#!/bin/sh

Затем мы можем выполнить скрипт:

$ ./some_script

Такие файлы называются «файлами Шебанга».

Теперь мы можем выполнять однофайловые Java-программы, используя тот же механизм.

Если добавить в начало файла следующее:

#!/path/to/java --source version

Например, давайте добавим следующий код в файл с именем add:

! / Usr / local / bin / java --source 11

import java.util.Arrays;

public class Addition
{
    public static void main(String[] args) {
        Integer sum = Arrays.stream(args)
          .mapToInt(Integer::parseInt)
          .sum();

        System.out.println(sum);
    }
}

И пометить файл как исполняемый:

$ chmod +x add

Затем мы можем выполнить файл как скрипт:

$ ./add 1 2 3

Мы также можем явно использовать панель запуска для вызова файла shebang:

java --source 11 add 1 2 3

Опция –source обязательна, даже если она уже присутствует в файле. Шебанг в файле игнорируется и рассматривается как обычный файл Java без расширения .java.

Несколько классов в одном файле

Как я упоминал ранее, эта функция поддерживает запуск кода, который находится в одном файле. Нет ограничений на количество классов в файле. Давайте рассмотрим пример кода, который содержит два класса:

Вы можете взять любое имя исходного файла Java Sharma.java

public class Test1{

    public static void main(String[] args){

        System.out.println("Hello " + Test2.print());
    }

}
public class Test2 {

    public static String print() {
        return "Java";
    } 
}

D:\WorkShop-jdk11\VarInference\src\varmodule\varpack>java .\Sharma.java

Hello Java
0 голосов
/ 10 мая 2019

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

class Test{
    public static void main(String args[]){
        Test1.m1();
        System.out.println("works");
   }
}
class Test1 {
    public static void m1(){
        System.out.println(" m1 ");
    }
}

Таким образом, ваш код будет работать.

Как видно из примера, вы можете позвонить Test1.m1() из вашегоОсновной метод, и вы можете увидеть результат.

...