常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。
常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性。
执行原理
在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量 ,右边是他的class文件,可以看到在编译阶段直接变成了字面量,因此运行阶段就不用再通过访问变量来找字面量,这样就可以优化性能,让使用常量的执行性能与使用字面量的相同
常量做信息标志和分类
举例:假设要做一个超级玛丽的控制方法。
package com.itheima.EnumDemo;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class enumDemo1 implements ActionListener {
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 win = new JFrame();
JPanel panel = new JPanel();
win.add(panel);
JButton btn1 = new JButton("上");
JButton btn2 = new JButton("下");
JButton btn3 = new JButton("左");
JButton btn4 = new JButton("右");
panel.add(btn1);
panel.add(btn2);
panel.add(btn3);
panel.add(btn4);
win.setLocationRelativeTo(null);
win.setSize(300,400);
win.setVisible(true);
btn1.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("上");
move(UP);
}
});
btn2.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("下");
move(DOWN);
}
});
btn3.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("左");
move(LEFT);
}
});
btn4.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("右");
move(RIGHT);
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
e.getSource();
}
public static void move(int flag)
{
switch (flag)
{
case UP :
System.out.println("超级玛丽往上跳");
break;
case DOWN:
System.out.println("超级玛丽往下蹲");
break;
case LEFT:
System.out.println("超级玛丽往左跑");
break;
case RIGHT:
System.out.println("超级玛丽往右跑");
break;
}
}
}
这个时候,我们用常量变量替换普通数字,这个时候代码的可读性就会变强,这个方法的作用有点类似于C语言中结构体的重命名。
枚举
枚举是什么?枚举是一种类,用来做信息的标志和信息的分类。
枚举类的第一行必须罗列枚举类的对象名称,建议全部大写
可以看出枚举类反编译之后是创建了四个常量对象,并且枚举类的构造器进行了私有化,因此不可以再创建枚举类对象,这就达到了信息标志和分类的目标,你只能用自己提供的对象。
package com.itheima.EnumDemo;public enum enumDemo { //枚举类的第一行必须罗列枚举类的对象名称 建议全部大写 SPring, SUMMER, AUTUMN, WINTER; //反编译后的代码为 // public static final Season SPRING = new SeaSon(); // public static final Season SUMMER = new SeaSon(); // public static final Season AUTUMN = new SeaSon(); // public static final Season WINTER = new SeaSon(); // 四个对象 //可以看出枚举类都是最终类,不能被继承 // 创建的四个对象都是常量,因此地址不能被修改,并且这个类的构造器私有化,因此枚举类不能创建对象 //相当于多例模式 }
枚举的作用
信息标志和分类
刚才已经讲过了常量可以做信息标志和分类,那么为什么还要用枚举类来做信息标志和分类呢?
因为在实际开发中,如果用常量来做信息的标志和分类的话,虽然可以实现可读性,但是Move方法的入参值不受约束,代码相对不够严谨,虽然你设置了常量,但是你接受该信息标志的时候,参数还是可以写成任意整数,但是当你用了枚举类,就相当于入参了,他就只能使用枚举类中写的对象,因此更加规范了书写格式,规范了代码的书写。