Основной метод в статическом внутреннем классе.? - программирование
Подтвердить что ты не робот

Основной метод в статическом внутреннем классе.?

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

public class TestBed {
    public TestBed() {
        System.out.println("Test bed c'tor");
    }

    @SuppressWarnings("unused")
    private static class Tester {
        public static void main(String[] args) {
            TestBed tb = new TestBed();
            tb.f();
        }
    }

    void f() {
        System.out.println("TestBed::f()");
    }
}
4b9b3361

Ответ 1

Если вы хотите запустить класс с java (Java launcher: java test.MyClass), то этот класс должен иметь основной метод с хорошо известной сигнатурой.

У вас может быть основной метод с той же подписью в любом месте. Но не ожидайте, что пусковая установка найдет его.

P.S. Имя языка - Java, а не JAVA.

Есть небольшая деталь:

Вы можете сделать это:

package test;

public class Test {

    /**
     * @param args the command line arguments
     */
    static public class A {

        public static void main(String[] args) {
            System.err.println("hi");
        }
    }
}

java test.Test $A

но это не стандартно...

Ответ 2

Любой класс, который может иметь статический метод, может иметь public static void main(String[] args).

Это включает в себя:

классы верхнего уровня (публичные или нет), например

public class Foo {
    public static void main(String[] args) { 
        System.out.println("Hello"); 
    }
}

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

Он не включает:

  • анонимные классы
  • внутренние нестатические классы

Итак, оба они являются незаконными:

public class Foo {
    private Object bar = new Object() {
        public static void main(String[] args) {
            System.out.println("Hello");
        }
    };
}


public class Foo {
    private class Bar {
        public static void main(String[] args) {
            System.out.println("Hello");
        }
    };
}

Ответ 3

Каждое приложение Java должно иметь основной метод. Его отправной точкой для выполнения кода в приложении. Его сигнатура метода:

public static void main(String[] args) 

Статический внутренний класс - это класс, который определяется внутри другого определения класса и помечен как статический.

Например, если внешний класс называется TestBed, тогда внутренний класс TestBed, который называется Tester, будет скомпилирован в TestBed $Tester.class. Разделение файлов .class означает, что вы можете сохранить дополнительный, вложенный код, тесно связанный с основным, внешним классом.

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

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

Чтобы выполнить метод main() этого класса TestBed.Tester,

% java TestBed$Tester

Ответ 4

Это интересно, поскольку код будет компилироваться и запускаться в Eclipse, но будет просто компилироваться с использованием строки commmand. Когда вы запустите eclipse, он найдет статический основной метод из внутреннего класса и запустит его.

Но при запуске java TestBed из командной строки вы получите ошибку - Exception in thread "main" java.lang.NoSuchMethodError: main, которая является допустимой ошибкой, так как вы не определили свой основной метод в основном классе.

Почему вы хотите определить свой основной метод во внутреннем классе? Ваш основной метод должен быть определен в открытом классе, это не правило, а обычная практика.

В приведенном ниже коде я переместил основной метод во внешний класс, который работает как в Eclipse, так и в командной строке:

public class TestBed {
    public TestBed() {
        System.out.println("Test bed c'tor");
    }

    @SuppressWarnings("unused")
    private static class Tester {

    }

    public static void main(String[] args) {
        TestBed tb = new TestBed();
        tb.f();
    }

    void f() {
        System.out.println("TestBed::f()");
    }
}