例1:

  1. class Outer {
  2. public void md1(final int a) {
  3. final int b = 1;
  4. class LocalA {
  5. int c = a;
  6. }
  7. class LocalB extends LocalA {
  8. LocalB() {
  9. super();
  10. }
  11. }
  12. }
  13. }

解语法糖后的形式如下:

  1. class Outer {
  2. public void md1(final int a) {
  3. final int b = 1;
  4. }
  5. }
  6. class Outer$1LocalA {
  7. /* synthetic */ final Outer this$0;
  8. /* synthetic */ final int val$a;
  9.  
  10. Outer$1LocalA(/* synthetic */ final Outer this$0,
  11. /* synthetic */ final int val$a) {
  12. this.this$0 = this$0;
  13. this.val$a = val$a;
  14. super();
  15. }
  16.  
  17. int c = val$a;
  18. }
  19. class Outer$1LocalB extends Outer$1LocalA {
  20. /*synthetic*/ final Outer this$0;
  21. /*synthetic*/ final int val$a;
  22.  
  23. Outer$1LocalB(/*synthetic*/ final Outer this$0,
  24. /*synthetic*/ final int val$a) {
  25. this.this$0 = this$0;
  26. this.val$a = val$a;
  27. super(this$0, val$a);
  28. }
  29. }

例2:

  1. class Outer {
  2. public void md1(final int a,final int b) {
  3. class LocalA {
  4. int c = b;
  5.  
  6. class LocalB {
  7. int d = a;
  8. }
  9. }
  10. }
  11. } 

解语法糖后如下:

  1. class Outer {
  2. public void md1(final int a, final int b) {}
  3. }
  4. class Outer$1LocalA {
  5. /* synthetic */ final Outer this$0;
  6. /* synthetic */ final int val$a;
  7. /* synthetic */ final int val$b;
  8.  
  9. Outer$1LocalA(/* synthetic */ final Outer this$0,
  10. /* synthetic */ final int val$b,
  11. /* synthetic */ final int val$a) {
  12. this.this$0 = this$0;
  13. this.val$b = val$b;
  14. this.val$a = val$a;
  15. super();
  16. }
  17.  
  18. int c = val$b;
  19. }
  20. class Outer$1LocalA$LocalB {
  21. /* synthetic */ final Outer$1LocalA this$1;
  22.  
  23. Outer$1LocalA$LocalB(/* synthetic */ final Outer$1LocalA this$1) {
  24. this.this$1 = this$1;
  25. super();
  26. }
  27.  
  28. int d = this$1.val$a;
  29. }

  

例3:

  1. class Outer {
  2. public void md1(final int a) {
  3. class LocalA {
  4. int x1 = a;
  5. }
  6.  
  7. class LocalB {
  8. Object x2 = new LocalA();
  9. }
  10. }
  11. }

解语法糖后如下:  

  1. class Outer {
  2. public void md1(final int a) { }
  3. }
  4. class Outer$1LocalA {
  5. /*synthetic*/ final Outer this$0;
  6. /*synthetic*/ final int val$a;
  7.  
  8. Outer$1LocalA(/*synthetic*/ final Outer this$0,
  9. /*synthetic*/ final int val$a) {
  10. this.this$0 = this$0;
  11. this.val$a = val$a;
  12. super();
  13. }
  14. int x1 = val$a;
  15. }
  16. class Outer$1LocalB {
  17. /*synthetic*/ final Outer this$0;
  18. /*synthetic*/ final int val$a;
  19.  
  20. Outer$1LocalB(/*synthetic*/ final Outer this$0,
  21. /*synthetic*/ final int val$a) {
  22. this.this$0 = this$0;
  23. this.val$a = val$a;
  24. super();
  25. }
  26. Object x2 = new Outer$1LocalA(this$0, val$a);
  27. }

 

例4:

  1. class Test {
  2. public void md1(final int a) {
  3. class Outer {
  4. class Inner {
  5. int c = a;
  6. }
  7.  
  8. }
  9. class LocalC extends Outer.Inner{
  10. LocalC(Outer a){
  11. a.super();
  12. }
  13. }
  14. }
  15. }

解语法糖如下:

  1. class Test$1Outer$Inner {
  2. /*synthetic*/ final Test$1Outer this$1;
  3.  
  4. Test$1Outer$Inner(/*synthetic*/ final Test$1Outer this$1) {
  5. this.this$1 = this$1;
  6. super();
  7. }
  8. int c = this$1.val$a;
  9. },
  10. class Test$1Outer {
  11. /*synthetic*/ final Test this$0;
  12. /*synthetic*/ final int val$a;
  13.  
  14. Test$1Outer(/*synthetic*/ final Test this$0, /*synthetic*/ final int val$a) {
  15. this.this$0 = this$0;
  16. this.val$a = val$a;
  17. super();
  18. }
  19. },
  20. class Test$1LocalC extends Test$1Outer$Inner {
  21. /*synthetic*/ final Test this$0;
  22.  
  23. Test$1LocalC(/*synthetic*/ final Test this$0, Test$1Outer a) {
  24. this.this$0 = this$0;
  25. super(a<*nullchk*>);
  26. }
  27. },
  28. class Test {
  29. public void md1(final int a) { }
  30. }

  

 

例5:

  1. class Outer {
  2. public void md(final int a) {
  3. class AOuter {
  4. class BOuter {
  5. // final Outer this$0 合成的变量
  6. class COuter {
  7. // final Outer$AOuter this$1 合成的变量
  8. int b = a;
  9. }
  10. }
  11. }
  12. }
  13. }

解语法糖后如下:

  1. class Outer {
  2. public void md(final int a) { }
  3. }
  4. class Outer$1AOuter {
  5. /*synthetic*/ final Outer this$0;
  6. /*synthetic*/ final int val$a;
  7.  
  8. Outer$1AOuter(/*synthetic*/ final Outer this$0,
  9. /*synthetic*/ final int val$a) {
  10. this.this$0 = this$0;
  11. this.val$a = val$a;
  12. super();
  13. }
  14. }
  15. class Outer$1AOuter$BOuter {
  16. /*synthetic*/ final Outer$1AOuter this$1;
  17.  
  18. Outer$1AOuter$BOuter(/*synthetic*/ final Outer$1AOuter this$1) {
  19. this.this$1 = this$1;
  20. super();
  21. }
  22. }
  23. class Outer$1AOuter$BOuter$COuter {
  24. /*synthetic*/ final Outer$1AOuter$BOuter this$2;
  25.  
  26. Outer$1AOuter$BOuter$COuter(/*synthetic*/ final Outer$1AOuter$BOuter this$2) {
  27. this.this$2 = this$2;
  28. super();
  29. }
  30. int b = this$2.this$1.val$a;
  31. }

例6:

 

  

Java语法糖之内部类的更多相关文章

  1. Javac语法糖之内部类

    在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ...

  2. Java语法糖设计

    语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...

  3. Java语法糖(二)

    语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...

  4. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  5. java语法糖---枚举

    java语法糖---枚举   在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...

  6. Java语法糖(一)

    概述 语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会. 解语法糖发生在Java源码被编译成Class字节码的过程中,还原回简单的基础语法结构. 语法糖之一:泛型( ...

  7. Java语法糖4:内部类

    内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...

  8. Java 语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...

  9. 深入理解java虚拟机(十二) Java 语法糖背后的真相

    语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...

随机推荐

  1. ueditor+word粘贴上传

    公司做的项目要用到文本上传功能. 网上找了很久,大部分都有一些不成熟的问题,终于让我找到了一个成熟的项目. 下面就来看看: 1.打开工程: 对于文档的上传我们需要知道这个项目是否符合我们的初衷. 运行 ...

  2. Shell编程-10-Shell中的数组

    目录 数组基础 数组示例 数组总结     如果大家有其他语言的基础或经验,就很快能明白数组了.简单来说,数组就某一种相同类型的元素组合,而后通过下标对其进行访问各元素. 数组基础 基础语法 第一种形 ...

  3. 分形之科赫(Koch)雪花

    科赫曲线是一种分形.其形态似雪花,又称科赫雪花.雪花曲线.瑞典人科赫于1904年提出了著名的“雪花”曲线,这种曲线的作法是,从一个正三角形开始,把每条边分成三等份,然后以各边的中间长度为底边.分别向外 ...

  4. 一致性hash(整理版)

    简单解释: 简单解释一致性hash的原理:网上通篇都是用服务器做的举例,我这里也如此,主要是便于理解. 通常:有N个客户端请求服务器,假设有M台web服务器,通常为了均衡访问会进行N%M的取模,然后分 ...

  5. Spring Security Hello World Example--reference

    In this tutorial, we will see how we can use Spring security to protect specific resources. This Hel ...

  6. <string.h>的学习

    感觉学习代码库最好的方法就是运行一下. 下面附上结果和示例代码 #include <stdio.h> #include <string.h> int main(){ const ...

  7. 【NumberValidators】工商营业执照号码和统一社会信用代码验证

    从本质上讲,工商营业执照号码和统一社会信用代码是两套完全不一样的编码规则,识别结果也仅有行政区划部分为两者共有,但因为这两种编码同时存在的原因,所以如果需要在系统中唯一标志一家企业时,还是可以通过工商 ...

  8. C# 利用VS中的插件来打包并发布winfrom程序

    1.先在VS 的扩展更新中搜索此插件[2015 installer Projects],点击下载,安装需要关闭VS 2.安装完毕之后新建项目 3.选择“application folder”项,然后在 ...

  9. 在WPF中将图片转换成3D图像并可以旋转

    时光偷走的,永远都是我们眼皮底下看不见的珍贵. https://pan.baidu.com/s/14dk-OU2SR0nxXj2bL4bVpQ 源码网站https://www.codeproject. ...

  10. 关于ASP.NET MVC4在IIS6中不认识安卓移动设备的解决办法

    在IIS7中发现安卓的手机浏览器是可以跳转滴. 项目中是采用***.mobile.cshtml来显示移动视图的. 部署到IIS6.0中发现并没有转到*.mobile.cshtml移动视图. 进过漫长的 ...