内部类之四:匿名内部类
匿名内部类概述
- 本质上是一个没有名字的局部内部类,定义在方法中,代码块中,等
- 作用:方便创建子类对象,最终目的为了简化代码编写
格式
new 类名|抽象类名|接口名(){
重写方法;
};
测试代码
package com.java.anonymous;
/**
* 匿名内部类的形式和特点
*/
public class Test {
public static void main(String[] args) {
/*
多态写法
Animal animal = new Tiger();
animal.run();
*/
//匿名内部类写法
//不用创建子类就可以完成构建对象调用功能
Animal animal = new Animal(){
@Override
public void run() {
System.out.println("两只老虎跑得快");
}
};
}
}
abstract class Animal {
public abstract void run();
}
class Tiger extends Animal {
@Override
public void run() {
System.out.println("两只老虎跑得快");
}
}
特点总结
- 匿名内部类是一个没有名字的内部类
- 匿名内部类写出来就会产生一个匿名内部类的对象
- 匿名内部类的对象类型相当于是当前new的那个的类型的子类类型
- 匿名内部类也会生成.class文件,因此其本身既是对象也是类
匿名内部类常见使用形式
-
匿名内部类可以作为方法的实际参数进行传输
第三点
package com.java.anonymous; /** * 匿名内部类的使用形式 */ public class Test2 { public static void main(String[] args) { // 1.原本的学生子类使用匿名内部类实现 Swimming s = new Swimming() { @Override public void swim() { System.out.println("学生蛙泳"); } }; go(s); // 2.原本的老师子类使用匿名内部类实现 Swimming s1 = new Swimming() { @Override public void swim() { System.out.println("老师仰泳"); } }; go(s1); // 3.匿名内部类作为入参直接放在go()方法里面,简化书写 go(new Swimming() { @Override public void swim() { System.out.println("裁判蝶泳"); } }); } /** * 中转方法,传递接口类型的实现类对象调用抽象方法 */ public static void go(Swimming s) { s.swim(); } } interface Swimming { void swim(); }
匿名内部类真实使用场景演示
-
给按钮绑定点击事件
package com.java.anonymous; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 通过GUI编程,理解匿名内部类的真实使用场景 */ public class Test3 { public static void main(String[] args) { // 1.创建主窗口,桌布对按钮尺寸自适应 JFrame win = new JFrame("登陆界面"); JPanel panel = new JPanel(); win.add(panel); // 2.创建一个按钮对象 JButton btn = new JButton("登录"); // 匿名对象监听器,实现对点击进行监听和事件绑定 btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(win, "点击成功"); } }); /* 匿名内部类在此处的简化形式 btn.addActionListener(e -> JOptionPane.showMessageDialog(win, "点击")); */ // 3.把按钮对象添加到窗口上展示 panel.add(btn); // 4.展示窗口 win.setSize(400, 300); win.setLocationRelativeTo(null); // 居中显示 win.setVisible(true); } }
-
开发中不是我们主动去定义匿名内部类的,而是别人需要我们写或者我们可以写的时候才会使用,匿名内部类的代码可以实现代码进一步的简化
网友评论