Почему мы не можем определить функцию main в статических внутренних классах?

У меня есть следующий простой код

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

Компилируется нормально. Но когда я запускаю его, я получаю следующую ошибку

[aniket@localhost src]$ java Tester
Error: Could not find or load main class Tester

Вопрос в том, почему мы не можем определить наш метод main в статическом внутреннем классе?

Обновление 1:

Как указано в ответах / комментариях, я изменил код на следующий

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

Я скомпилировал его, и он сделал два файла классов Tester.class а также Tester$TesterChild.class, Но все равно я получаю ошибку

[aniket@localhost Desktop]$ java Tester$TesterChild
Error: Could not find or load main class Test

Обновление 2:

Хорошо, теперь я включил текущий каталог в classpath и выполнил все еще получая ошибку

[aniket@localhost Desktop]$ java -cp . Tester$TesterChild
Error: Main method not found in class Tester, please define the main method as:
   public static void main(String[] args

3 ответа

Решение

Это можно запустить как main но вы не используете правильный класс. Ваш основной класс не Tester но Tester.TesterChild,

В Eclipse он будет работать без какой-либо настройки, но из командной строки вы должны использовать java 'yourpackage.Tester$TesterChild' синтаксис, как и другие упомянутые выше.

Вы должны обернуть название вашего класса в ''s потому что в Linux/ Unix оболочка может думать, что $TesterChild переменная Если вы попробуете это в приглашении, вы получите что-то вроде этого, если вы пропустите ''s:

Ошибка: не удалось найти или загрузить тестер основного класса

Если вам нужно явно указать путь к классу, вы можете использовать -cp или -classpath вариант или вы можете установить его из командной строки: set CLASSPATH=/somedir

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

использовать командную строку java Tester$TesterChild,
Обновить
Я думаю, что вы помещаете файл Java в какой-то пакет. Если затем использовать эту командную строку.

java -cp . yourPackageName.Tester$TesterChild
Например, я поместил файл в пакет с именем testТогда моя команда такая

java -cp . test.Tester$TesterChild

Помните, что знак доллара имеет особое значение для большинства оболочек. Т.е. если пишешьjava -cp . Tester$TesterChild ваша оболочка может заменить $TesterChild с содержимым переменной окружения с этим именем или молча заменить его ничем, если он не существует. Пытаться java -cp . 'Tester$TesterChild' или же java -cp . Tester\$TesterChild

Другие вопросы по тегам