例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. vue+大文件分片上传

    最近公司在使用vue做工程项目,实现大文件分片上传. 网上找了一天,发现网上很多代码都存在很多问题,最后终于找到了一个符合要求的项目. 工程如下: 对项目的大文件上传功能做出分析,怎么实现大文件分片上 ...

  2. *单链表[递归&不带头结点]

    不带头结点的单链表,递归法比较简明!(必背!) 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建第一种 ...

  3. bzoj2938(ac自动机)

    刚学了ac自动机,去hzwer上找了道练习题: 串是安全的就说明ac自动机不会找到匹配,考虑ac自动机的匹配过程: 我们把val等于1的点删掉和fail指针指向被删掉的点删掉: 如果剩下的图有环,就有 ...

  4. Objective-C:01简介

    1.Objective-C简介 Objective-C是一种面向对象的计算机语言 OC不是一门全新的语言 C语言的基础上增加了一层最小的面向对象语法 OC完全兼容C语言 可以在OC代码中混入C语言代码 ...

  5. 杭电2133What day is it

    给你个日期 问是星期几        知道1 1 1是周1就行了 #include <iostream>#include <cstdio>using namespace std ...

  6. AngularJS config run 及区别和例子

    一.config方法 在模块加载阶段,对模块进行自定义配置 config可以注入$stateProvider, $urlRouterProvider, $controllerProvider, $pr ...

  7. Java学习--循环语句

    1. break public class BreakDemo{ // 完成一个四则运算的功能 public static void main(String args[]){ for(int i=0; ...

  8. 前端开发 - HTML/CSS

    概述 HTML是英文HyperText Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记). 相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...

  9. Java框架知识点总结

    一.Struts1的运行原理 在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionSe ...

  10. 如何获取帮助———— QQ群讨论摘要

    QQ群对话整理(删除一些简单的回应),对一些重要的地方,我做了一些加粗   宝玉 2015/9/21 1:49:05       这次题目还有个问题就是如何读取Excel,我想对于很多同学来说是个困难 ...