Java语法糖之内部类
例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语法糖之内部类的更多相关文章
- Javac语法糖之内部类
在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ...
- Java语法糖设计
语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...
- Java语法糖(二)
语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...
- Java语法糖1:可变长度参数以及foreach循环原理
语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...
- java语法糖---枚举
java语法糖---枚举 在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...
- Java语法糖(一)
概述 语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会. 解语法糖发生在Java源码被编译成Class字节码的过程中,还原回简单的基础语法结构. 语法糖之一:泛型( ...
- Java语法糖4:内部类
内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...
- Java 语法糖详解
语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...
- 深入理解java虚拟机(十二) Java 语法糖背后的真相
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...
随机推荐
- SQL编写-谁和谁是好朋友
problem: 用户表 姓名 张三 李四 王五 好友表 姓名 好友姓名 张三 李四 张三 王五 李四 张三 用户表里面姓名必须在好友表里面互加为好友,请问如何找出还没有加为好友的姓名 ...
- ejb servlet demo
官方文档: http://docs.oracle.com/javaee/6/tutorial/doc/gijre.html package converter.ejb; import java.mat ...
- golang web sample
一.学习想法 用两天的时间学习golang,但这次是先不看书的,直接写代码先. 我们常习惯边看书边学习写代码,但发现过程是比较缓慢的,所以我就先想写代码, 边写边查.就我们所知,web app一般是基 ...
- 20169207《Linux内核原理与分析》第八周作业
本章的作业依旧包括两部分,1.阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第11,12章. 2.学习MOOC「Linux内核分析」第六讲「进程的 ...
- SSM_CRUD新手练习(6)分页后台控制器编写
经过测试基础环境已经搭建好了,现在我们开始编写CRUD. 我们来看一下查询的逻辑该怎么写: 1.访问index.jsp页面 2.index.jsp页面发送查询员工的请求 3.EmployeeContr ...
- Java Map释放内存置null以及调用clear()的区别
今天自己在总结map的时候,想到了在释放Map对象空间的时候就有使用过将Map对象置null,也有时候会调用clear()将Map中的数据清除,那么它们都有什么区别呢? Map<Integer, ...
- [violet2]sillyz
题意:定义S(n) = n*各数位之积,然后给定L<=R<=10^18,求有多少个n在[L,R]区间内 思路: 看了半天无从下手..看完题解才豁然开朗.. 具体思路看vani神博客吧.讲的 ...
- Android Studio-引用jar及so文件
一.引用jar文件 1.将jar文件复制.粘贴到app的libs目录中: 2.右键点击jar文件,并点击弹出菜单中的“Add As Library”,将jar文件作为类库添加到项目中: ...
- Strom开发配置手册
一:Storm集群搭建 1.本次开发使用的是storm0.9.3 2.Storm0.9.3集群搭建: 1)storm集群角色包含集群主节点Nimbus:集群从节点Supervisor 2)集群安装:先 ...
- Ubuntu 修改环境变量
按变量的生存周期来划分,Linux变量可分为两类,它们的修改方法如下:(1)永久的:需要修改配置文件,变量永久生效. 常见的配置文件包括: (1-1)/etc/profile:对所有用户生效:此文件为 ...