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

时间:2012-02-03 08:56:44

标签: java

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

4 个答案:

答案 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()");
    }
}