【Java-Day08】static / final / 枚举

目录

一.static关键字

[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类中很少会用

调用方式:

  • 类名调用(推荐)

关于类

  1. **Javabean类:**用于描述一类事物的。
  2. 测试类:带有main方法的,是测试的主入口。
  3. 工具类: 不是描述一类事物的,也没有main方法,而是帮我们做一些事情的类,比如遍历数组,求最值等。工具类不可以创建对象

写一个工具类:

  1. 类名见名知意,一般以Util结尾
  2. 私有化构造方法:工具类不能被创建对象。
  3. 工具类里的方法都定义为静态方法,外界通过类名调用。

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表示最终,不可变。 可以修饰变量、类、方法。

特点:

  1. 只能赋值一次,数据不可变常量
  2. 常量名大写 ,多个单词下划线隔开

注意:

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);
属性
行为
}

注意:

  1. 使用枚举对象,不用自己创建,直接调用就可以:枚举类名.枚举项;
  2. 枚举类也不让外界创建本类对象,需要私有化构造方法(枚举类的构造方法默认private,可以省略不写)。
  3. 每一个枚举项,都是该枚举类的对象,每一个对象都是通过构造方法创建出来的
  4. 枚举项在底层其实就是常量,默认用public static final 修饰
  5. 枚举类的第一行上必须是枚举项,枚举项之间用逗号隔开,以分号作为结尾
  6. 编译器会给枚举类新增两个默认存在的方法: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
相关推荐
橙淮1 小时前
Spring Bean作用域与生命周期全解析
java·spring
风吹夏回1 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei111 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1121 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding1 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋91 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本2 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
xiaoshuaishuai82 小时前
C# 内存管理与资源泄漏
开发语言·c#
DIY源码阁2 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse