例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. poj 1125 Stockbroker Grapevine(最短路径)

    Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a me ...

  2. 基于udp协议的套接字,socketserver模块,多道技术,进程理论

    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆的代码 进程:程序执行的过程 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统的其他所有 ...

  3. 基础总结篇之一:Activity生命周期[转]

    from:http://blog.csdn.net/liuhe688/article/details/6733407   基础总结篇之一:Activity生命周期 子曰:溫故而知新,可以為師矣.< ...

  4. java基本语法、标识符、关键字

    基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...

  5. PHP搜索 搜索 搜索

    //搜索界面 public function search(){ $param=input('param.'); $where=[]; //搜索框 if(!empty($param['content' ...

  6. codeblock快捷键使用

    •在编辑区按住右键可拖动代码,省去拉滚动条之麻烦:相关设置:Mouse Drag Scrolling. •Ctrl+D可复制当前行或选中块. •可拖动选中块使其移动到新位置,按住Ctrl则为复制到新位 ...

  7. allegro中如何添加安装孔(注:在PCB图纸中添加)

    最近再给外国一家公司做某一个小的系统模块的封装,其中这个模块中间是挖空的,这就比较难办,到现在为止我还没有找到如何在封装中添加自己绘制特定形状的过孔,(倒是可以添加软件自带的一些圆形的安装孔)最终解决 ...

  8. double float的精度问题

    三部曲 1: #include <iostream> #include <stdio.h> #include <string.h> using namespace ...

  9. node-webkit学习(2)基本结构和配置

    node-webkit学习(2)基本结构和配置 文/玄魂 目录 node webkit学习(2)基本结构和配置 前言 2.1  基本程序结构 2.2  package.json 2.2.1 必须的配置 ...

  10. 关于能量场和力场弯曲空间的实验证明 EXPERIMENTAL PROOF ON THE BENDING SPACE OF ENERGY FIELD AND FORCE FIELD

    前文提到,F = ma, E = mc^2,并且等效是传递的,等效概念具有同属性.所以不止能量,力场也可以弯曲空间. 实验:某人被头顶上方的电站10几万伏的设备吸收,烧毁双臂. (虽然这个实验不应具有 ...