Основной метод в статическом внутреннем классе.?
Я узнал, что единственный публичный класс в файле 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()");
}
}
Ответы
Ответ 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()");
}
}