前言
- 该文章为Java基础自学笔记
- 其他内容:Java基础学习笔记目录
- 学习用书:
《Java核心技术 卷Ⅰ 基础知识(第10版)》
《Java经典编程300例》
第十九章 final关键字、常量、枚举
19.1 final关键字
19.1.1 final关键字的作用
- final关键字是最终的意思,可以修饰方法、变量、类
- 修饰方法: 表明该方法是最终方法,不能被重写
- 修饰变量: 表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一下)
- 修饰类: 表明该类是最终类,不能被继承
19.1.2 final修饰变量
- final修饰的变量是基本类型: 变量存储的数据值不能发生改变
- final修饰的变量时引用类型: 变量存储的地址值不能发生改变,但地址指向的对象内容可以发生变化
19.2 常量
19.2.1 常量的概述
- 常量是使用了 public static final 修饰的成员变量,必须有初始化值,执行的过程中其值不能被改变
19.2.2 常量的作用
- 可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性
19.2.3 常量命名规范
19.2.4 常量的执行原理
- 在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量
- 这样做的好处是让使用常量程序的执行性能与直接使用字面量的执行性能一样
- FinalDemo.java
public class FinalDemo{
public static final String NAME = "李明";
public static void main(String[] args) {
System.out.println(NAME);
}
}
public class FinalDemo {
public static final String NAME = "李明";
public FinalDemo() {
}
public static void main(String[] args) {
System.out.println("李明");
}
}
【常量案例】超级玛丽游戏
- 需求:
- 需要接收用户输入四个方向的信号(上下左右),以便控制超级玛丽的移动方向
- 代码
public class FinalDemo {
public static final int UP = 1;
public static final int DOWN = 2;
public static final int LEFT = 3;
public static final int RIGHT = 4;
public static void main(String[] args) {
JFrame window = new JFrame();
JPanel panel = new JPanel();
window.add(panel);
JButton btnUp = new JButton("上");
JButton btnDown = new JButton("下");
JButton btnLeft = new JButton("左");
JButton btnRight = new JButton("右");
panel.add(btnUp);
panel.add(btnDown);
panel.add(btnLeft);
panel.add(btnRight);
window.setLocationRelativeTo(null);
window.setSize(300, 100);
window.setVisible(true);
btnUp.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(UP);
}
});
btnDown.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(DOWN);
}
});
btnLeft.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(LEFT);
}
});
btnRight.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(RIGHT);
}
});
}
public static void move(int action) {
switch (action) {
case UP:
System.out.println("跳了一下");
break;
case DOWN:
System.out.println("蹲了一下");
break;
case LEFT:
System.out.println("向左移动");
break;
case RIGHT:
System.out.println("向右移动");
break;
}
}
}
- 测试
跳了一下
蹲了一下
向左移动
向右移动
19.3 枚举
19.3.1 枚举的概述
19.3.2 枚举的作用
19.3.3 枚举类的定义格式
修饰符 enum 枚举名称 {
第一行罗列枚举类实例的名称;
}
19.3.4 反编译后枚举的特征
>javac Season.java
>javap Season.class
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
public final class Season extends java.lang.Enum<Season> {
public static final Season SPRING;
public static final Season SUMMER;
public static final Season AUTUMN;
public static final Season WINTER;
public static final Season[] values();
public static Season valueOf(java.lang.String);
static {
};
}
19.3.5 枚举的特征
- 枚举类都是继承了枚举类型:java.lang.Enum
- 枚举都是最终类,不可以被继承
- 枚举的构造器都是私有的,枚举对外不能创建内容
- 枚举类的第一行默认都是罗列枚举对象的名称
- 枚举类相当于是多例模式
19.3.6 枚举与常量作信息标志和分类
- 常量:
- 虽然可以实现可读性,但入参值不受约束,代码相对不够严谨
- 枚举:
【枚举案例】超级玛丽游戏
public enum Orientation {
UP, DOWN, LEFT, RIGHT;
}
public class EnumDemo {
public static void main(String[] args) {
JFrame window = new JFrame();
JPanel panel = new JPanel();
window.add(panel);
JButton btnUp = new JButton("上");
JButton btnDown = new JButton("下");
JButton btnLeft = new JButton("左");
JButton btnRight = new JButton("右");
panel.add(btnUp);
panel.add(btnDown);
panel.add(btnLeft);
panel.add(btnRight);
window.setLocationRelativeTo(null);
window.setSize(300, 100);
window.setVisible(true);
btnUp.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(Orientation.UP);
}
});
btnDown.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(Orientation.DOWN);
}
});
btnLeft.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(Orientation.LEFT);
}
});
btnRight.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
move(Orientation.RIGHT);
}
});
}
public static void move(Orientation orientation) {
switch (orientation) {
case UP:
System.out.println("跳了一下");
break;
case DOWN:
System.out.println("蹲了一下");
break;
case LEFT:
System.out.println("向左移动");
break;
case RIGHT:
System.out.println("向右移动");
break;
}
}
}