目录
[1.1 static 关键字修饰成员变量](#1.1 static 关键字修饰成员变量)
[1.2 static 关键字修饰成员方法](#1.2 static 关键字修饰成员方法)
[1.3 静态的注意事项](#1.3 静态的注意事项)
[二. final 关键字](#二. final 关键字)
一.static关键字
1.1 static 关键字修饰成员变量
特点:
- static修饰的变量叫做静态变量,被该类所有对象共享。
- 静态变量不属于对象,属于类。
- 静态变量随着类的加载而加载,优先于对象而存在。
共享:
对静态变量只要赋值一次
只要有一个对象修改了静态变量,其他对象再次访问的时候就是修改之后的结果了。
调用方式:
- 方式一:类名调用(推荐)
举个例子:
创建一个学生类,但所有学生共享 一个老师,改变老师的话,所有学生对象里的老师都要变,此时可以将老师设置为静态变量。


1.2 static 关键字修饰成员方法
特点:
- static修饰的方法叫做静态方法
- 该方法多用在测试类和工具类中
- Javabean类中很少会用
调用方式:
- 类名调用(推荐)
关于类:
- **Javabean类:**用于描述一类事物的。
- 测试类:带有main方法的,是测试的主入口。
- 工具类: 不是描述一类事物的,也没有main方法,而是帮我们做一些事情的类,比如遍历数组,求最值等。工具类不可以创建对象
写一个工具类:
- 类名见名知意,一般以Util结尾。
- 私有化构造方法:工具类不能被创建对象。
- 工具类里的方法都定义为静态方法,外界通过类名调用。
Tips:
如果不手动写一个私有化构造方法,new时会自动创建一个构造方法 ,这个构造方法默认为public,所以需要自己写私有化构造方法。
举个例子:
写一个遍历数组的工具类:
java
public class ArrayUtils {
//私有化构造方法:不让外界创建对象
private ArrayUtils() {}
//定义静态方法
public static void printArr(int[] arr){
System.out.print("[");
for(int i=0; i<arr.length; i++){
if(i==arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}
}
java
public static void main(String[] args) {
//创建一个数组
int[] arr = {10,20,30,40,50};
//遍历
ArrayUtils.printArr(arr);//[10,20,30,40,50]
}
1.3 静态的注意事项
- 静态方法只能访问静态变量 和其他的静态方法:静态优先于对象产生放在堆里的静态区,直接访问会报错。
- 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法。
- 静态方法中是没有this关键字
总结:静态只能调用静态,非静态可以调用所有,静态方法无this
二. final 关键字
final :表示最终,不可变。 可以修饰变量、类、方法。
特点:
- 只能赋值一次,数据不可变(常量)
- 常量名大写 ,多个单词下划线隔开
注意:
final修饰基本数据类型:
- byte short int long float double char boolean
变量里面记录的是真实的数据
java
final int A = 10;
此时变量里记录的数据无法改变
final 修饰引用数据类型:
- int , Student Teacher...
stu 里存的是对象的内存地址,不可变的是stu里的内存地址
而对象里的属性值是可以发生变化的。
java
final Student STU = new Student();
三.枚举
什么是枚举:
枚举是一个特殊的Javabean类 ,这个枚举类 的对象 是有限的、固定的 。
使用场景:
订单的状态、月份、星期、游戏角色职业、会议室预约状态、设备状态..
格式:
public enum 枚举类名{
对象1(枚举项1),对象2(枚举项2),对象3(枚举项3);
属性
行为
}
注意:
- 使用枚举对象,不用自己创建,直接调用就可以:枚举类名.枚举项;
- 枚举类也不让外界创建本类对象,需要私有化构造方法(枚举类的构造方法默认private,可以省略不写)。
- 每一个枚举项,都是该枚举类的对象,每一个对象都是通过构造方法创建出来的
- 枚举项在底层其实就是常量,默认用public static final 修饰
- 枚举类的第一行上必须是枚举项,枚举项之间用逗号隔开,以分号作为结尾
- 编译器会给枚举类新增两个默认存在的方法:values(),valueof()。
values(): 表示拿到这个枚举类的所有的枚举项
valueof(): 根据枚举项的名字(英文) ,找到对应的枚举对象(中文说明)。
举个例子:
电商项目中,订单的状态只有以下6种,请编写代码实现。
- 待支付 PAYMENT_PENDING
- 处理中 PROCESSING
- 己发货 SHIPPED
- 配送中 OUT_FOR_DELIVERY
- 己送达 DELIVERED
- 己取消 CANCELLED


解释:
在创建 OrderState 枚举类时,第一行的每个枚举项就已经通过调用构造方法创建出对象了,创建出来的这个对象就是枚举项本身。
也就是说 PAYMENT_PENDING("待支付") 等价于下面这种写法:
java
public static final OrderState PAYMENT_PENDING = new OrderState("待支付");
可以这么理解:创建一个名叫 PAYMENT_PENDING 的枚举对象,并把 "待支付" 传给构造方法保存起来。
values():表示获取本类所有的枚举项
用OrderState.values()会返回一个数组 ,在这个数组中,装的就是当前类里所有的枚举项。
java
OrderState[] arr = OrderState.values();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//输出:PAYMENT_PENDING PROCESSING SHIPPED OUT_FOR_DELIVERY DELIVERED CANCELLED
valueOf():表示获取一个指定的枚举项
用OrderState.valueOf("SHIPPED"),括号里需要传入枚举项的名字 ,他会得到对应的枚举对象。
java
OrderState shipped = OrderState.valueOf("PROCESSING");
System.out.println(shipped);//输出:PROCESSING