为什么我们不能在静态内部类中定义main函数?

时间:2013-08-26 09:30:39

标签: java inner-classes

我有以下简单代码

public class Tester {
    static class TesterChild {
        public static void main(String args[]) {
            System.out.println("Test");
        }
    }
}

编译好。但是当我运行它时,我得到以下错误

[aniket@localhost src]$ java Tester
Error: Could not find or load main class Tester

问题是为什么我们不能在静态内部类中定义我们的main方法?

Update1:​​

如答案/评论中所述,我已将代码更改为以下

public class Tester {
    public static class TesterChild {
        public static void main(String args[]) {
            System.out.println("Test");
        }
    }
}

我编译了它,它创建了两个类文件Tester.classTester$TesterChild.class。但我仍然得到错误

[aniket@localhost Desktop]$ java Tester$TesterChild
Error: Could not find or load main class Test

更新2:

好的,现在我在类路径中包含当前目录并执行仍然收到错误

[aniket@localhost Desktop]$ java -cp . Tester$TesterChild
Error: Main method not found in class Tester, please define the main method as:
   public static void main(String[] args

3 个答案:

答案 0 :(得分:4)

它可以作为main运行,但您没有使用正确的类。您的主要课程不是Tester,而是Tester.TesterChild

在Eclipse中,它将在没有任何设置的情况下运行,但是从命令行开始,您必须像上面提到的那样使用java 'yourpackage.Tester$TesterChild'语法。

您需要在''中包装类的名称,因为在linux / unix上,shell可能认为$TesterChild是一个变量。如果你在提示中尝试一下,如果省略'' s,你会得到类似的东西:

  

错误:无法找到或加载主类测试程序

如果您需要显式设置类路径,可以使用-cp-classpath选项,也可以从命令行设置:set CLASSPATH=/somedir

答案 1 :(得分:1)

由于您已在内部类中定义了main()方法 运行内部类以使main()被执行。

使用命令行java Tester$TesterChild 更新
我认为你将java文件放在一些包中。如果使用这个命令行。

java -cp . yourPackageName.Tester$TesterChild
例如,我将文件放在名为test的包中。然后我的命令就像这样

java -cp . test.Tester$TesterChild

答案 2 :(得分:1)

请注意美元符号对大多数贝壳都有特殊意义。即如果你写 java -cp . Tester$TesterChild您的shell可能会将$TesterChild替换为具有该名称的环境变量的内容,或者如果它不存在则以静默方式替换它。试试java -cp . 'Tester$TesterChild'java -cp . Tester\$TesterChild