class Aa{
void m(){System.out.println("outer");}
}public class TestInners { public static void main(String[] args) {
new TestInners().go(); }
void go(){
new Aa().m();
class Aa{void m(){System.out.println("inner");}}
}
class Aa{void m(){System.out.println("middle");}}
}在go()方法中不是可以调用外面的类Aa吗?打印出来“outer”?难道编译器有个就近原则?

解决方案 »

  1.   

    你的testinner类中有Aa类当然先从本类中查找了!
      

  2.   


    真疯了!
    public class TestInners { 
    public static void main(String[] args) { 
    new TestInners().go();     } 
    void go(){ 
    new Aa().m(); //这时候打印:middle
    class Aa{
    void m(){
    System.out.println("inner");
    }
    }

    class Aa{
        void m(){
        System.out.println("middle");
    }
       } 
    }
    但是奇怪的是:
    public class TestInners { 
    public static void main(String[] args) { 
    new TestInners().go();     } 
    void go(){ 
        class Aa{
    void m(){
    System.out.println("inner");
    }
    }
    new Aa().m(); //这时候打印:inner

    class Aa{
        void m(){
        System.out.println("middle");
    }
       } 
      

  3.   


    扯淡吧,要说近,
    下面两种情况一样远
    void go(){ 
            new Aa().m(); //这时候打印:middle
            class Aa{
                void m(){
                    System.out.println("inner");
                }
            }
        } 
    void go(){ 
            class Aa{
                void m(){
                    System.out.println("inner");
                }
            }
            new Aa().m(); //这时候打印:middle
     } 
    都在go()的作用域以内
      

  4.   

    不好意思写错了,第二种情况下输出:inner
      

  5.   

    没什么奇怪的,
             
                
            new Aa().m(); //这时候打印:middle。。这样写时候inner定义在调用之后,相当于没有定义,以调外层的middle,,同样,要是这句写在之后就直接调用本作用域内的inner
            class Aa{
                void m(){
                    System.out.println("inner");
                }
            }
      

  6.   

    代码是顺序执行的 你把它放到inner之后 inner就离new Aa().m()更近了  如果放在前面  inner类还没有呢...
      

  7.   

    lz移步看这个帖子:http://topic.csdn.net/u/20090930/10/f749588f-e757-4e66-adcc-e27c57e625b8.html?73508
      

  8.   

    int i=0;
    System.out.print(i);

    System.out.print(i);
    int i=0;
    有没有区别?
    写在下面就相当于没有定义。取外层已经定义过的。
      

  9.   

    貌似是这个道理void go(){ 
    new Aa().m(); //这时候打印:middle
    class Aa{
    void m(){
    System.out.println("inner");
    }
    }
    new Aa().m(); //这时候打印:inner
    } void go();
      Code:
       Stack=3, Locals=1, Args_size=1
       0: new #5; //class TestInners$Aa--->这里生成的TestInners$Aa的实例
       3: dup
       4: aload_0
       5: invokespecial #6; //Method TestInners$Aa."<init>":(LTestInners;)V
       8: invokevirtual #7; //Method TestInners$Aa.m:()V
       11: new #8; //class TestInners$1Aa--->这里生成的TestInners$1Aa的实例   14: dup
       15: aload_0
       16: invokespecial #9; //Method TestInners$1Aa."<init>":(LTestInners;)V
       19: invokevirtual #10; //Method TestInners$1Aa.m:()V
       22: return
      LineNumberTable: 
       line 7: 0
       line 13: 11
       line 14: 22
    }
      

  10.   

    你试过吗?真的能把inner打印出来?编译都过不了...
      

  11.   


    public class TestInners { 
    public static void main(String[] args) { 
    new TestInners().go();     } 
    void go(){ 
    new Aa().m(); //这时候打印:middle
    class Aa{
    void m(){
    System.out.println("inner");
    }
    }
    new Aa().m(); //这时候打印:inner

    class Aa{
        void m(){
        System.out.println("middle");
    }
       }
    }Compiled from "TestInners.java"
    public class TestInners extends java.lang.Object
      SourceFile: "TestInners.java"
      InnerClass: 
       #12= #5 of #2; //Aa=class TestInners$Aa of class TestInners
       #12= #8; //Aa=class TestInners$1Aa
      minor version: 0
      major version: 50
      Constant pool:
    const #1 = Method #11.#23; //  java/lang/Object."<init>":()V
    const #2 = class #24; //  TestInners
    const #3 = Method #2.#23; //  TestInners."<init>":()V
    const #4 = Method #2.#25; //  TestInners.go:()V
    const #5 = class #26; //  TestInners$Aa
    const #6 = Method #5.#27; //  TestInners$Aa."<init>":(LTestInners;)V
    const #7 = Method #5.#28; //  TestInners$Aa.m:()V
    const #8 = class #29; //  TestInners$1Aa
    const #9 = Method #8.#27; //  TestInners$1Aa."<init>":(LTestInners;)V
    const #10 = Method #8.#28; //  TestInners$1Aa.m:()V
    const #11 = class #30; //  java/lang/Object
    const #12 = Asciz Aa;
    const #13 = Asciz InnerClasses;
    const #14 = Asciz <init>;
    const #15 = Asciz ()V;
    const #16 = Asciz Code;
    const #17 = Asciz LineNumberTable;
    const #18 = Asciz main;
    const #19 = Asciz ([Ljava/lang/String;)V;
    const #20 = Asciz go;
    const #21 = Asciz SourceFile;
    const #22 = Asciz TestInners.java;
    const #23 = NameAndType #14:#15;//  "<init>":()V
    const #24 = Asciz TestInners;
    const #25 = NameAndType #20:#15;//  go:()V
    const #26 = Asciz TestInners$Aa;
    const #27 = NameAndType #14:#31;//  "<init>":(LTestInners;)V
    const #28 = NameAndType #32:#15;//  m:()V
    const #29 = Asciz TestInners$1Aa;
    const #30 = Asciz java/lang/Object;
    const #31 = Asciz (LTestInners;)V;
    const #32 = Asciz m;{
    public TestInners();
      Code:
       Stack=1, Locals=1, Args_size=1
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: return
      LineNumberTable: 
       line 2: 0
       line 16: 4
    public static void main(java.lang.String[]);
      Code:
       Stack=2, Locals=1, Args_size=1
       0: new #2; //class TestInners
       3: dup
       4: invokespecial #3; //Method "<init>":()V
       7: invokevirtual #4; //Method go:()V
       10: return
      LineNumberTable: 
       line 4: 0
       line 6: 10
    void go();
      Code:
       Stack=3, Locals=1, Args_size=1
       0: new #5; //class TestInners$Aa
       3: dup
       4: aload_0
       5: invokespecial #6; //Method TestInners$Aa."<init>":(LTestInners;)V
       8: invokevirtual #7; //Method TestInners$Aa.m:()V
       11: new #8; //class TestInners$1Aa
       14: dup
       15: aload_0
       16: invokespecial #9; //Method TestInners$1Aa."<init>":(LTestInners;)V
       19: invokevirtual #10; //Method TestInners$1Aa.m:()V
       22: return
      LineNumberTable: 
       line 8: 0
       line 14: 11
       line 15: 22
    }
    能不能编译自己看!
      

  12.   

    看了大家热情的解释和探讨。明白了大概。这些问题也让我知道得好好地了解jvm的运行原理,类的加载等等知识。这些都没好好了解所以才出现了这些问题。所以很感谢大家。这是我做《scjp考试指南》上的题时感到的疑惑。
    再次感谢大家啦!O(∩_∩)O