我了解到Java文件中唯一的公共类也必须具有main方法。但是,在下面你可以看到内部类中的main方法而不是? 关于源文件中主要方法定义的规则是什么?
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()");
}
}
答案 0 :(得分:6)
如果你想用java启动一个类(Java启动器:java test.MyClass),那么这个类必须有一个带有众所周知签名的main方法。
您可以在任何地方使用相同签名的主方法。但是不要指望发射器会找到它。
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
但这是非标准的......
答案 1 :(得分:4)
任何可以拥有静态方法的类都可以有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");
}
};
}
答案 2 :(得分:2)
每个Java应用程序都必须有一个main方法。它是在应用程序中执行代码的起点。它的方法签名是:
public static void main(String[] args)
静态内部类是在不同类的定义中定义并标记为静态的类。
例如,如果外部类名为TestBed,那么名为Tester的内部类TestBed将被编译为TestBed $ Tester.class。 .class文件的分离意味着您可以将补充的嵌套代码与主外部类紧密耦合。
它们位于同一个源文件中,内部类实际上位于外部类中。所有这一切,您不必支付任何部署或运行时间成本。
通过使用静态内部类,您可以为系统添加其他支持功能,以实现测试等功能,同时在正常的生产部署中不会受到任何处罚。
执行该TestBed.Tester类的main()方法,
% java TestBed$Tester
答案 3 :(得分:-1)
这很有趣,因为代码将在Eclipse中编译和运行,但只能使用命令行进行编译。当你从eclipse运行时,它将从内部类中找到静态main方法并运行它。
但是当从命令行运行java TestBed
时,您将收到错误 - Exception in thread "main" java.lang.NoSuchMethodError: main
这是一个有效错误,因为您尚未在主类中定义主方法。
为什么要在内部类中定义main方法?你的主要方法应该在公共课中定义,这不是一个规则,而是常见的做法。
在下面的代码中,我将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()");
}
}