您的位置:首页 > 编程语言 > Java开发

为什么内部类可以访问外部类的变量

2016-07-10 19:16 387 查看
先写一个Otter类

public class Otter {
int outerField = 0;

class Inner{
void InnerMethod(){
int i = outerField;
}
}
}


进入该类目录,通过javac Otter.java 编译得到Otter.class和Otter$Inner.class



然后通过javap -classpath . -v Otter.$Inner(其中.表示当前目录下寻找class文件,-v为-verbose输出信息较多)得到反编译文件:

Compiled from "Otter.java"
public class com.example.xiahangli.memoryleakeage.Otter extends java.lang.Object
SourceFile: "Otter.java"
InnerClass:
#6= #5 of #3; //Inner=class com/example/xiahangli/memoryleakeage/Otter$Inner of class com/example/xiahangli/memoryleakeage/Otter
minor version: 0
major version: 50
Constant pool:
const #1 = Method   #4.#16; //  java/lang/Object."<init>":()V
const #2 = Field    #3.#17; //  com/example/xiahangli/memoryleakeage/Otter.outerField:I
const #3 = class    #18;    //  com/example/xiahangli/memoryleakeage/Otter
const #4 = class    #19;    //  java/lang/Object
const #5 = class    #20;    //  com/example/xiahangli/memoryleakeage/Otter$Inner
const #6 = Asciz    Inner;
const #7 = Asciz    InnerClasses;
const #8 = Asciz    outerField;
const #9 = Asciz    I;
const #10 = Asciz   <init>;
const #11 = Asciz   ()V;
const #12 = Asciz   Code;
const #13 = Asciz   LineNumberTable;
const #14 = Asciz   SourceFile;
const #15 = Asciz   Otter.java;
const #16 = NameAndType #10:#11;//  "<init>":()V
const #17 = NameAndType #8:#9;//  outerField:I
const #18 = Asciz   com/example/xiahangli/memoryleakeage/Otter;
const #19 = Asciz   java/lang/Object;
const #20 = Asciz   com/example/xiahangli/memoryleakeage/Otter$Inner;

{
int outerField;

public com.example.xiahangli.memoryleakeage.Otter();
Code:
Stack=2, Locals=1, Args_size=1
0:   aload_0
1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
4:   aload_0
5:    iconst_0
6:   putfield    #2; //Field outerField:I
9:   return
LineNumberTable:
line 6: 0
line 7: 4
line 9: 9

}


忽略一些常量池信息,分析内部类文件

其中:

这里写代码片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java