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

本文深入探讨了Java中内部类的概念及其实现方式。通过具体的代码示例,详细介绍了如何定义和使用内部类,并展示了如何通过javac和javap工具进行编译与反编译来观察内部类的具体结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先写一个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


}

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

这里写代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值