前言
在刷题过程中遇到下面这条语句,看起来十分简洁,但是没看明白其中用到的语法,故学习了一下。
HashMap<Character, String> map = new HashMap<>(){ {put('2', "abc"); put('3', "def"); put('4', >"ghi"); put('5', "jkl"); put('6', "mno"); put('7', "pqrs"); put('8', "tuv"); put('9', "wxyz");} };
这里涉及到两个语法,匿名内部类和实例初始化块。
匿名内部类
- 匿名内部类是一种没有名字的局部内部类。它通常用于创建一个只需在一个地方使用的小型类。
- 匿名内部类通常用于在代码中定义并实例化接口、抽象类或已有类的子类。
- 定义匿名内部类的语法为:
new 类名或接口名 () {...}
,其中{...}
包含了匿名内部类的实现。 - 匿名内部类可以覆盖父类或接口中的方法,或者定义自己的方法。
- 匿名内部类通常在创建对象时立即定义和初始化。
JAVA匿名内部类(Anonymous Classes)
实例初始化块
- 实例初始化块是一个在类的实例化过程中执行的代码块。
- 它不是方法,而是一个在创建对象时执行的代码段,用于进行对象的初始化工作。
- 实例初始化块使用一对花括号
{}
括起来,放置在类的实例变量和构造方法之间。 - 实例初始化块可以包含任意的Java代码,用于执行初始化操作,例如计算、赋值、异常处理等。
- 当创建一个类的对象时,实例初始化块会在构造方法之前执行。
别再把静态初始化块和实例初始化块混为一谈了
小结
示例代码中的{{...}}
使用了匿名内部类的语法,并在内部定义了一个实例初始化块,该块包含了多个put
方法调用,用于初始化map
对象。匿名内部类包含了实例初始化块,这个实例初始化块在创建map
对象时执行,向map
中添加了键值对。这种方式可以用于在创建对象时执行一些特定的初始化操作,而不需要显式定义一个子类或构造方法。
HashMap<Character, String> map = new HashMap<>() {};
上述代码实际上是定义了一个匿名内部类,是 HashMap
的子类,用来实例化 map
,但并没有任何实际操作。
HashMap<Character, String> map = new HashMap<>() {{put('2', "abc");put('3', "def");put('4', "ghi");put('5', "jkl");put('6', "mno");put('7', "pqrs");put('8', "tuv");put('9', "wxyz");}
};
第一对大括号里就可以写一般类能写的东西,比如构造方法,成员变量,其他方法等。只不过这里写了一个实例初始化块,用来初始化 map
。
仅限刷题使用,实际项目中不建议使用。
Java:双括号初始化 /匿名内部类初始化法