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”?难道编译器有个就近原则?
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”?难道编译器有个就近原则?
真疯了!
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");
}
}
}
扯淡吧,要说近,
下面两种情况一样远
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()的作用域以内
new Aa().m(); //这时候打印:middle。。这样写时候inner定义在调用之后,相当于没有定义,以调外层的middle,,同样,要是这句写在之后就直接调用本作用域内的inner
class Aa{
void m(){
System.out.println("inner");
}
}
System.out.print(i);
和
System.out.print(i);
int i=0;
有没有区别?
写在下面就相当于没有定义。取外层已经定义过的。
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
}
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
}
能不能编译自己看!
再次感谢大家啦!O(∩_∩)O