例1:

class Outer {
	public void md1(final int a) {
		final int b = 1;
		class LocalA {
			int c = a;
		}
		class LocalB extends LocalA {
			LocalB() {
				super();
			}
		}
	}
}

解语法糖后的形式如下:

class Outer {
    public void md1(final int a) {
        final int b = 1;
    }
}
class Outer$1LocalA {
	/* synthetic */ final Outer this$0;
	/* synthetic */ final int val$a;

	Outer$1LocalA(/* synthetic */ final Outer this$0,
			      /* synthetic */ final int val$a) {
		this.this$0 = this$0;
		this.val$a = val$a;
		super();
	}

	int c = val$a;
}
class Outer$1LocalB extends Outer$1LocalA {
    /*synthetic*/ final Outer this$0;
    /*synthetic*/ final int val$a;

    Outer$1LocalB(/*synthetic*/ final Outer this$0,
    		      /*synthetic*/ final int val$a) {
        this.this$0 = this$0;
        this.val$a = val$a;
        super(this$0, val$a);
    }
}

例2:

class Outer {
	public void md1(final int a,final int b) {
		class LocalA {
			int c = b;

			class LocalB {
				int d = a;
			}
		}
	}
} 

解语法糖后如下:

class Outer {
	public void md1(final int a, final int b) {}
}
class Outer$1LocalA {
	/* synthetic */ final Outer this$0;
	/* synthetic */ final int val$a;
	/* synthetic */ final int val$b;

	Outer$1LocalA(/* synthetic */ final Outer this$0,
			      /* synthetic */ final int val$b,
			      /* synthetic */ final int val$a) {
		this.this$0 = this$0;
		this.val$b = val$b;
		this.val$a = val$a;
		super();
	}

	int c = val$b;
}
class Outer$1LocalA$LocalB {
	/* synthetic */ final Outer$1LocalA this$1;

	Outer$1LocalA$LocalB(/* synthetic */ final Outer$1LocalA this$1) {
		this.this$1 = this$1;
		super();
	}

	int d = this$1.val$a;
}

  

例3:

class Outer {
	public void md1(final int a) {
		class LocalA {
			int x1 = a;
		}

		class LocalB {
           Object x2 = new LocalA();
		}
	}
}

解语法糖后如下:  

class Outer {
    public void md1(final int a) {    }
}
class Outer$1LocalA {
    /*synthetic*/ final Outer this$0;
    /*synthetic*/ final int val$a;

    Outer$1LocalA(/*synthetic*/ final Outer this$0,
    		      /*synthetic*/ final int val$a) {
        this.this$0 = this$0;
        this.val$a = val$a;
        super();
    }
    int x1 = val$a;
}
class Outer$1LocalB {
    /*synthetic*/ final Outer this$0;
    /*synthetic*/ final int val$a;

    Outer$1LocalB(/*synthetic*/ final Outer this$0,
    		      /*synthetic*/ final int val$a) {
        this.this$0 = this$0;
        this.val$a = val$a;
        super();
    }
    Object x2 = new Outer$1LocalA(this$0, val$a);
}

 

例4:

class Test {
    public void md1(final int a) {
		class Outer {
			class Inner {
				int c = a;
			}

		}
        class LocalC  extends Outer.Inner{
        	LocalC(Outer a){
        		a.super();
        	}
        }
    }
}

解语法糖如下:

class Test$1Outer$Inner {
    /*synthetic*/ final Test$1Outer this$1;

    Test$1Outer$Inner(/*synthetic*/ final Test$1Outer this$1) {
        this.this$1 = this$1;
        super();
    }
    int c = this$1.val$a;
},
class Test$1Outer {
    /*synthetic*/ final Test this$0;
    /*synthetic*/ final int val$a;

    Test$1Outer(/*synthetic*/ final Test this$0, /*synthetic*/ final int val$a) {
        this.this$0 = this$0;
        this.val$a = val$a;
        super();
    }
},
class Test$1LocalC extends Test$1Outer$Inner {
    /*synthetic*/ final Test this$0;

    Test$1LocalC(/*synthetic*/ final Test this$0, Test$1Outer a) {
        this.this$0 = this$0;
        super(a<*nullchk*>);
    }
},
class Test {
    public void md1(final int a) {   }
}

  

 

例5:

class Outer {
	public void md(final int a) {
		class AOuter {
			class BOuter {
				// final Outer this$0 合成的变量
				class COuter {
					// final Outer$AOuter this$1 合成的变量
					int b = a;
				}
			}
		}
	}
}

解语法糖后如下:

class Outer {
    public void md(final int a) { }
}
class Outer$1AOuter {
    /*synthetic*/ final Outer this$0;
    /*synthetic*/ final int val$a;

    Outer$1AOuter(/*synthetic*/ final Outer this$0,
    		      /*synthetic*/ final int val$a) {
        this.this$0 = this$0;
        this.val$a = val$a;
        super();
    }
}
class Outer$1AOuter$BOuter {
    /*synthetic*/ final Outer$1AOuter this$1;

    Outer$1AOuter$BOuter(/*synthetic*/ final Outer$1AOuter this$1) {
        this.this$1 = this$1;
        super();
    }
}
class Outer$1AOuter$BOuter$COuter {
    /*synthetic*/ final Outer$1AOuter$BOuter this$2;

    Outer$1AOuter$BOuter$COuter(/*synthetic*/ final Outer$1AOuter$BOuter this$2) {
        this.this$2 = this$2;
        super();
    }
    int b = this$2.this$1.val$a;
}

例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. Cron连接正常工作5次后异常原因分析

    目录 目录 1 问题描述 1 分析定位 1 解决方法 2 附1:Cron工作流 3 附2:SIGPIPE发生的位置 3 如果一个shell命令的"$?"值为141,则它是收到了SI ...

  2. Ubuntu下安装并配置TexStudio

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7069715.html Ubuntu下安装并配置TexStudio Ubunt ...

  3. ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)

    IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...

  4. android-基础编程-democoderjoy-架构篇

    设计这个demo很简单,针对每个控件放到一个listitem中去,主activity继承之listActivity,这样再override其单击效果进入到每个控件. 主界面流程 1.继承 MainAc ...

  5. Android FragmentActivity 嵌套 Fragment 调用startActivityForResult返回的requestCode错误

    Android FragmentActivity 嵌套 Fragment 调用startActivityForResult返回的requestCode错误 此时,要在调用startActivityFo ...

  6. 你真的会Xilinx FPGA的复位吗?

    Get Smart About Reset: Think Local, Not Global. 对于复位信号的处理,为了方便我们习惯上采用全局复位,博主在很长一段时间内都是将复位信号作为一个I/O口, ...

  7. POJ1644状态转移的思想——排列组合

    m个物品放n个盒子,盒子物品都相同,问你放的方法总数是多少 看着像个排列组合,算着算着就发现我排列组合都忘得差不多啦,哎,什么时候能打败遗忘呢 然后想用dp做,但是转移的方面没有想好 看了看题解感觉这 ...

  8. bootstrap3文章

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...

  9. 团队博客--测试发布(队名:Running Duck)

    代码链接:Tetris 码云地址 一.Alpha版本测试报告 1.测试计划 测试内容 1.方块生成下落 2.方块左右移动 3.方块快速下滑 4.本汉字替换 5.下一个汉字提示 6.方块颜色生成 7.汉 ...

  10. Android-Kotlin-配置/入门

    1.配置Kotlin开发插件,点击File菜单,选择Settings,选择Plugins,会显示扩展的插件; 2.然后选择Browse repositories...,搜索栏目中搜索Kotlin即可, ...