本地类和匿名类在java中的编译顺序是什么?

本地类和匿名类在java中的编译顺序是什么?,java,class,javac,Java,Class,Javac,假设我有两个同名的本地类,但它们是用不同的方法定义的。它们将以什么顺序编译,它们将有什么名称 class ExampleClass { public void test() { NestedClass.nestedTest2(); NestedClass.nestedTest(); } private static class NestedClass { private static int a; p

假设我有两个同名的本地类,但它们是用不同的方法定义的。它们将以什么顺序编译,它们将有什么名称

class ExampleClass {

    public void test() {
        NestedClass.nestedTest2();
        NestedClass.nestedTest();

    }

    private static class NestedClass {
        private static int a;

        public static void nestedTest() {
            class Test1 {
                void method1() {}

            }
        }

        public static void nestedTest2() {
            class Test1 {
                void method2() {}
            }
        }
    }
}
我使用javac命令获得这些编译文件

ExampleClass$NestedClass$1Test1
ExampleClass$NestedClass$2Test1
还有其他文件,我只是觉得没有必要把它们全部列出


问题是,为什么第一个文件(以$1Test1结尾,在nestedTest()方法中定义)比另一个文件(在nestedTest2方法中定义)更早编译?订单取决于什么?正如您所见,我还尝试在ExampleClass中调用测试方法来更改顺序,但我不相信这会有帮助,实际上也没有帮助。

更多的是编译器内部设计如何继续。承诺是代码要被很好地编译、优化,而不是如何完成。为了预测编译顺序,应该深入到内部,并认为这并非小事。(有些东西可能是直观的,但确实如此???)编译器日志也确实反映了内部发生的事情:一步一步???(可能在某些步骤上,但对于所有的???通常应该是…想想它是如何被转储的)为什么这很重要?如果你在编程时希望产生副作用,那么这会有成效吗?或者你想成为最终不得不调试或修改你的代码的程序员的麻烦?我不希望答案是“它恰好以这种方式在编译器中实现”,但是有人可能会给出答案,因为这个问题看起来相当有趣。你不应该期望调用方法会影响它们的编译顺序,但是重新排序
nestedTest()
nestedTest2()
的定义也会交换所包含的
Test1
类的编译顺序。因此,它们只是在源代码中进行排序。