文档章节

Java中的内部类实例初始化匿名函数(JLS7 8.6:Instance Initializers)

qalong
 qalong
发布于 2013/09/02 10:20
字数 289
阅读 3434
收藏 6

偶尔发现了一段好玩的java代码,关于Java内部类的,觉得很有意思,但是想不明白这段代码是java语法的特性哪?还是别的什么。最后发现还是对java了解的不够深啊。先上代码:

import java.util.ArrayList;
import java.util.List;

public class Main {

	public static void main(String[] args) {
		List<String> lst = new ArrayList<String>() {
			@Override
			public boolean add(String paramE) {
				return super.add("LST-" + paramE);
			}

			{
				add("a");
				add("45");
				add("a");
				add("asdfs");
			}
		};
		
		for (String str : lst) {
			System.out.println(str);
		}
	}
}


最后多谢@brayden的解答,查看了JLS定义中的Instance Initializers,了解到这个是Java语法标准。顺便我反编译了一下,生成的代码,下面这段匿名方法最终会编译到这个内部类的构造函数中。

{
    add("a");
    add("45");
    add("a");
    add("asdfs");
}


其实看看反编译后的代码就都明白了:

Main.class

import java.io.PrintStream;
import java.util.ArrayList;


public class Main
{
  public static void main(String[] paramArrayOfString)
  {
    ArrayList local1 = new ArrayList()
    {
      public boolean add(String paramAnonymousString) {
        return super.add("LST-" + paramAnonymousString);
      }
    };
    for (String str : local1)
      System.out.println(str);
  }
}
Main$1内部类
import java.util.ArrayList;


final class Main$1 extends ArrayList<String>
{
  Main$1()
  {
    add("a");
    add("45");
    add("a");
    add("asdfs");
  }

  public boolean add(String paramString)
  {
    return super.add("LST-" + paramString);
  }
}

© 著作权归作者所有

qalong
粉丝 6
博文 12
码字总数 4244
作品 0
威海
技术主管
私信 提问
java并发编程——对象的发布与逸出

对象发布(Publish)和逸出(Escape) 对象发布:就是提供一个对象的引用给作用域之外的代码。比如return一个对象,或者作为参数传递到其他类的方法中。 对象逸出:一种错误的发布,当一个对...

长头发-dawn
2018/10/08
147
1
关于Java对象的继承和多态学习笔记

-------------------------关于对象的构造过程------------------------ 如果类B继承了类A,那么当创建类B的实例时,遵循如下过程: 1、如果类A有静态的成员变量,初...

mj4738
2012/01/15
169
1
Java map双括号初始化方式的问题

关于Java双括号的初始化凡是确实很方便,特别是在常量文件中,无可替代。如下所示: Map map = new HashMap() {   {   put("Name", "Unmi");   put("QQ", "1125535");   } }; 好处很明......

Airship
2015/02/28
2.7K
0
在 Java 中初始化 List 的五种方法

在 Java 中初始化 的五种方法 1.构造 后使用 初始化 2.使用 双括号语法 3.使用 4. 使用 (JDK8) 5. 使用 (JDK9) 参考 在 Java 中初始化 的五种方法 Java 中经常需要使用到 List,下面简单介...

yzbyzz
2018/12/05
0
0
kotlin使用过程中的踩坑记录

app的build.gradle中也需要加上implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",否则可能会出现Unresolved reference: JvmName类似的错误 Arouter中使用kotlin编......

VanEasley
01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
26分钟前
3
0
支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)

上篇文章《支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)》介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建、配置,运维、扩容等具体操作 集群搭建 2018年10月 Re...

分布式系统架构
27分钟前
5
0
JVM -- 垃圾回收算法及分代垃圾收集器

Hello,今天记录下 Java虚拟机中的其中一个重点知识 --> 垃圾回收算法及分代垃圾收集器。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建...

猫狗熊
40分钟前
3
0
ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
今天
8
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部