Java 匿名内部类
2021-03-11 本文已影响0人
Figo_OU
匿名内部类是什么?可能我们用得很多,只是不知道她的芳名。
List<Integer> nums= Arrays.asList(1, 2, 3);
Collections.sort(nums, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;}
});
使用的Comparator就是一个匿名内部类。new 出来的对象就是一个匿名对象。
- 既然是匿名类,所以你无法在别的地方使用这个类(实例化,调用它的静态方法之类的), 只能使用一次。
- 调用其他包的protected方法
2.1 场景:要调用不同包中一个类的protected 方法 且 你不想多写一个类去继承。
2.2 实现:
package com.bds.models;
public class InnerTestInOtherClass {
protected void test(){
System.out.println("这是一个保护方法");
}
}
package com.bds.ozxTest;
public class InnerTestMainClass {
public static void main(String[] args) {
// InnerTestInOtherClass innerTestInOtherClass = new InnerTestInOtherClass();
// innerTestInOtherClass.test(); //无法访问该方法
new InnerTestInOtherClass(){
void superTest(){
super.test();
}
}.superTest();
}
}
当然你可以写个类继承这个类,就能调用父类的protected方法。匿名类更方便,你的目的只是调用这个方法而已 。
image.png想复用WebMvcConfigurationSupport的getMessageConverter方法,但是定义为protected方法,所以使用匿名类来调用
Lambda 替代匿名内部类
过去给方法传动态参数的唯一方法是使用内部类。比如
1.Runnable
接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("The runable now is using!");
}
}).start();
//用lambda
new Thread(() -> System.out.println("It's a lambda function!")).start();
2.Comperator
接口
List<Integer> strings = Arrays.asList(1, 2, 3);
Collections.sort(strings, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;}
});
//Lambda
Collections.sort(strings, (Integer o1, Integer o2) -> o1 - o2);
//分解开
Comparator<Integer> comperator = (Integer o1, Integer o2) -> o1 - o2;
Collections.sort(strings, comperator);
3.Listener
接口
JButton button = new JButton();
button.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
e.getItem();
}
});
//lambda
button.addItemListener(e -> e.getItem());