12_代码块,内部类,Lambda表达式,窗体的使用,设计模式
JAVA SE 代码块,内部类,Lambda表达式,窗体的使用,设计模式
代码块
在Java类下,使用 { } 括起来的代码被称为代码块
分类:局部代码块 构造代码块 静态代码块 同步代码块[多态]
- 局部代码块
位置:方法中定义
作用:限定变量的生命周期,及早释放,提高内存利用率
- 构造代码块
位置:类中方法外定义
特点:每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
- 静态代码块
位置:类中方法外定义
特点:需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
作用:在类加载的时候做一些数据初始化的操作;加载配置文件
1 | |
内部类
内部类:定义在一个类里面的类
创建对象的格式
外部类名.内部类名 对象名 = new 外部类对象().new 内部类对象();
1 | |
成员访问细节 :
- 内部类中, 访问外部类成员 : 直接访问, 包括私有
- 外部类中, 访问内部类成员 : 需要创建对象访问
1 | |
静态内部类 : static 修饰的成员内部类
创建对象格式 : 外部类名.内部类名 对象名 = new 外部类名.内部类对象();
注意事项 : 静态只能访问静态
1 | |
局部内部类: 放在方法、代码块、构造器等执行体中
1 | |
匿名内部类
概述 : 匿名内部类本质上是一个特殊的局部内部类(定义在方法内部),匿名内部类可以使代码更加简洁,定义一个类的同时对其进行实例化
前提 : 需要存在一个接口或类
格式 :
new 类名\接口名 () { }
1 | |
问题: 方法的形参是接口类型, 我们该传入的是什么?
: —–>传入的是该接口的实现类对象 要实现的方法多时,就实例化一个接口,方法少时就用匿名内部类**
1 | |
Lambda表达式
Lambda表达式 : JDK8开始后的一种新语法形式
作用 : 简化匿名内部类的代码写法。
格式 : () -> {}
1 | |
注意:Lambda 表达式只能简化函数式接口的匿名内部类的写法形式
函数式接口
- 必须是接口,接口中有且仅有一个抽象方法的形式
- 通常会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口。
1 | |
IDEA简化成Lambda快捷键:alt+回车
Lambda表达式的省略写法
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时 () 也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码
可以省略大括号不写,同时要省略分号
此时,如果这行代码是return语句,必须省略return不写,同时也必须省略 “;” 不写
1 | |
匿名内部类&Lambda
匿名内部类 : 可以操作类, 接口
Lambda表达式 : 只能操作函数式接口
匿名内部类:编译之后,产生一个单独的.class字节码文件
Lambda表达式:编译之后,没有一个单独的.class字节码文件
1 | |
窗体、组件、事件
1 | |
组件的添加
窗体对象.setLayout(null); 取消默认布局
创建组件对象
组件对象.setBounds(x,y,width,height); 设置摆放位置
窗体对象.getContentPane().add(组件对象);
如果相同位置,先来的会显示,优先级高,后设置的被覆盖;
窗体中添加按钮组件
1 | |
使用JLabel展示文本和图片
1 | |
监听器的使用
动作事件 : ActionListener
鼠标点击
1
2
3
4
5
6
7
8
9
10JButton btn = new JButton("按钮"); //按钮点击事件
btn.setBounds(0,0,100,100);
frame.getContentPane().add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
}
});空格按键
通过打印e.getKeyCode()的值,快速获取需要的按键代码数值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33frame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
//无法监听:fn,ctrl,esc,上下左右 很少用
}
@Override
public void keyPressed(KeyEvent e) { //点击事件
int keyCode = e.getKeyCode();
if(keyCode == 37) {
System.out.println("左");
}else if(keyCode == 38){
System.out.println("上");
}else if(keyCode == 39){
System.out.println("右");
}else if(keyCode == 40){
System.out.println("下");
}
}
//适配器模式
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("键盘");
} //只需要重写这一个方法
});
@Override
public void keyReleased(KeyEvent e) { //松开事件
}
});
焦点: 程序的注意力集中在了某一个组件上
注: 按钮组件比较特殊, 在创建好之后, 程序的焦点, 默认就在按钮组件上
但按钮组件, 其实不需要占用程序的焦点,通过setFocusable(false); 取消焦点;
1 | |
否则:监听点击按钮事件和键盘点击事件同时设置后,焦点在按钮上,操作键盘会显示按钮事件发生,自己的键盘事件无法使用。
设计模式
设计模式(Design pattern):一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
目的:使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
适配器设计模式:解决接口与接口实现类之间的矛盾问题
实现步骤
- 编写一个 xxxAdapter 类, 实现对应接口
- 重写内部所有抽象方法, 但方法都是空实现
- 让自己的类去继承适配器类, 重写自己需要的方法即可
- 为了避免其他类创建适配器类的对象, 使用 abstract 进行修饰
1 | |
模板设计模式:把抽象类整体看做成一个模板,模板中不能决定的东西定义成抽象方法
让使用模板的类(继承抽象类的类)去重写抽象方法实现需求
目的:模板设计模式的优势,模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
1 | |
1 | |