静态内部类中的主要方法。

我了解到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()"); } } 

如果你想用java启动一个类(Java启动器:java test.MyClass),那么这个类必须有一个带有众所周知签名的main方法。

您可以在任何地方使用相同签名的main方法。 但不要指望发射器能找到它。

PS语言的名称是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.

但这是非标准的……

任何可以拥有静态方法的类都可以有一个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"); } }; } 

每个Java应用程序都必须有一个main方法。 它是在应用程序中执行代码的起点。 它的方法签名是:

 public static void main(String[] args) 

静态内部类是在不同类的定义内定义并标记为静态的类。

例如,如果外部类名为TestBed,那么名为Tester的内部类TestBed将被编译为TestBed $ Tester.class。 .class文件的分离意味着您可以将补充的嵌套代码与主外部类紧密耦合。

它们位于相同的源文件中,内部类实际上位于外部类中。 所有这一切,您不必支付任何类型的部署或运行​​时间成本。

通过使用静态内部类,您可以为系统添加其他支持function,以实现测试等function,同时在正常的生产部署中不会受到任何处罚。

要执行该TestBed.Tester类的main()方法,

 % java TestBed$Tester 

这很有趣,因为代码将在Eclipse中编译和运行,但只能使用命令行进行编译。 从eclipse运行时,它将从内部类中找到静态main方法并运行它。

但是当java TestBed运行java TestBed ,你会收到错误 – Exception in thread "main" java.lang.NoSuchMethodError: main这是一个有效的错误,因为你没有在main类中定义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()"); } }