博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内部类实现原理
阅读量:2442 次
发布时间:2019-05-10

本文共 3185 字,大约阅读时间需要 10 分钟。

关于内部类的定义和使用,这里不做过多介绍,不太清楚的请先行了解。

自己写了一个类,里面有内部类和局部内部类。通过javac和javap去了解内部类的大体实现过程。

先附上代码

public class Use {    private String name;    private Integer age;    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    public class UseInner {        private String innerName;        public String getInnerName() {            return innerName;        }        public void setInnerName(String innerName) {            this.innerName = innerName;        }        public void testInner() {            System.out.println("out:" + name + "-" + age + "-" + innerName);        }    }    public String getSendChanenl() {        class Channel {            private Integer code;            private String name;            private UseInner useInner;            public Integer getCode() {                return code;            }            public void setCode(Integer code) {                this.code = code;            }            public String getName() {                return name;            }            public void setName(String name) {                this.name = name;            }            public UseInner getUseInner() {                return useInner;            }            public void setUseInner(UseInner useInner) {                this.useInner = useInner;            }        }        Channel channel = new Channel();        channel.setCode(1);        channel.setName("XXX");        return channel.getCode() + channel.getName() + channel.getUseInner().getInnerName();    }}

通过javac Use.java编译后,产生了3个class文件,他们分别是Use.class、Use$1Channel.class和Use$UseInner.class。

分别使用javap命令查看class文件信息。

javap -p Use

Compiled from "Use.java"public class Use {  private java.lang.String name;  private java.lang.Integer age;  public Use();  public java.lang.Integer getAge();  public void setAge(java.lang.Integer);  public void setName(java.lang.String);  public java.lang.String getName();  public java.lang.String getSendChanenl();  static java.lang.String access$000(Use);  static java.lang.Integer access$100(Use);}

上面有两个方法值得我们注意:

static java.lang.String access$000(Use);  为内部类提供外围类name属性的访问

static java.lang.Integer access$100(Use); 为内部类提供外围类age属性的访问

默认修饰符加static是当前方法只能在同一个包下访问。而内部类真是通过编译器生成一个同一个包下的类,来实现内部类。

javap -p Use\$1Channel.class

Compiled from "Use.java"class Use$1Channel {  private java.lang.Integer code;  private java.lang.String name;  private Use$UseInner useInner;  final Use this$0;  Use$1Channel(Use);  public java.lang.Integer getCode();  public void setCode(java.lang.Integer);  public java.lang.String getName();  public void setName(java.lang.String);  public Use$UseInner getUseInner();  public void setUseInner(Use$UseInner);}

这里把Use对象通过构造函数构造进来,就是为了能够访问外围类,且这里是final修饰的,对应唯一。

javap -p Use\$UseInner.class

Compiled from "Use.java"public class Use$UseInner {  private java.lang.String innerName;  final Use this$0;  public Use$UseInner(Use);  public java.lang.String getInnerName();  public void setInnerName(java.lang.String);  public void testInner();}

这个和上面的类似,也是把Use构造进来。

如果您有疑问,欢迎留言评论!

转载地址:http://nqnqb.baihongyu.com/

你可能感兴趣的文章
RedHat Linux 9下所有权和许可权限(转)
查看>>
C++程序设计从零开始之语句(转)
查看>>
利用Apache+PHP3+MySQL建立数据库驱动的动态网站(转)
查看>>
C#中实现DataGrid双向排序(转)
查看>>
利用C语言小程序来解决大问题(转)
查看>>
简单方法在C#中取得汉字的拼音的首字母(转)
查看>>
.NET开发之中的17种正则表达式小结(转)
查看>>
编程秘籍:使C语言高效的四大绝招(转)
查看>>
配置XDM--一种Linux的图形登录界面(转)
查看>>
计算机加锁 把U盘变成打开电脑的钥匙(转)
查看>>
C#开发的两个基本编程原则的深入讨论(转)
查看>>
Fedora Core 4 基础教程 (上传完毕)(转)
查看>>
删除MSSQL危险存储过程的代码(转)
查看>>
红旗软件:树立国际的Linux品牌(转)
查看>>
Linux学习要点(转)
查看>>
影响mysqld安全的几个选项(转)
查看>>
最新版本Linux Flash 9 Beta开放发布(转)
查看>>
mysql事务处理(转)
查看>>
Fedora 显示设备配置工具介绍(转)
查看>>
FREEBSD 升级及优化全攻略(转)
查看>>