1、 static 修饰静态成员变量
使用 static 处理上述数据冗余,将重复数据保存到一个区域,需要时直接调用。
2、 static 关键字使用和特征分析
特征:
1、static修饰的静态成员变量,不推荐使用类对象调用,推荐使用类名直接使用。类对象调用 Eclipse 工具提示警告,静态成员变量和类对象无关。【没有对象】
2、静态成员变量无论通过哪一种手段修改,修改数据之后,所有使用对应数据的位置全部受到对应数据位置全部受到影响。静态成员变量对应当前【类】唯一,独一份。静态成员变量是一个共享资源,一处修改,处处受影响。
3、静态成员变量在没有对象之前可以通过类名调用,在对象销毁后,依然可以通过该类名调用静态成员变量和类对象无关。【没有对象】 静态成员变量生存周期是早于类对象出现,晚于类对象销毁。
3、类加载问题
类加载:
java中的类加载:
1、JVM分析当前程序所有所需的 .class 字节码文件
目前程序需要 A.class B.class C.class , 其他的 D.class 不需要
2、会根据当前程序的运行情况,分析每一个类应该执行的时间
流程:
1、A执行
2、B执行
3、C执行
3、对应类在执行之前,会将所有的static修饰的内容进行处理。
static 修饰静态成员变量
加载到内存的【数据区】,准备就绪,已具备数据存储和数据提供能力,并且独一份。
static 修饰静态成员方法
加载到内存的【方法区】,已经具备执行能力,所有和方法执行相关的内容全部准备就绪
修饰符,返回类型,方法名,形式参数列表,方法体
static 修饰静态代码块
加载到内存的【方法区】,并且直接执行,有且只执行一次
4、static 内容处理完毕之后,程序才可以运行。
4、 静态成员变量内存存储问题
内存:
栈区:局部变量
堆区:实例化对象、 数组
方法区: 所有可以执行的代码都在方法区, .class 字节码文件都在内存的【方法区】
1、静态成员方法
2、成员方法
3、类型声明
静态成员变量在内存的【数据区】
在程序加载过程中,程序执行之前,静态成员变量内存空间申请,数据类型确定,目前存储数据情况,都全部准备就绪,已经具备数据存储和数据提供能力。
例如:开一个饭店。准备好的桌椅板凳已经是可以使用的了
【static 修饰的静态成员变量独一份,在类文件加载过程中,有且只执行一次】
5、static 修饰静态成员变量总结【重点】
1、存放空间
静态成员变量存储于内存的【数据区】,属于公共区域
2、归属权问题
静态成员变量属于当前类,和对象无关。【没有对象】
3、修改问题
静态成员变量一处修改,从修改位置开始,之后的所有使用位置全部修改
4、使用权
可以通过类名调用,也可以在类对象中使用。
调用过程推荐使用类名,不推荐使用类对象【没有对象】
5、共享资源
静态成员变量独一份,静态成员变量所有当前类的对象都可以使用,是一个公共资源
6、生存时间问题
静态成员变量是随着类文件加载,已经在内存的数据区具备数据存储和数据提供能力,已经可以使用。此时没有实例化对象。当前对象被销毁之后,静态成员变量依然可以使用。程序退出之前,所有的对象会被 JVM 销毁,之后才会清理 static 修饰内容占用的空间问题。
static 修饰的静态成员变量和类对象生存周期不同,与对象无关【没有对象】
6、static 修饰静态成员方法
格式:
权限修饰符 static 返回值类型 方法名(形式参数列表) {
方法体;
}
7、static 修饰静态成员方法特征总结
1. 静态成员方法推荐使用类名调用,不推荐使用类对象调用。因为静态成员变量和对象无关。【没有对象】
2. 静态成员方法不可以直接使用类内的非静态成员变量
非静态成员变量需要类对象调用,和对象有绑定关系。静态成员方法中【没有对象】3. 静态成员方法不可以直接使用类内的非静态成员方法
非静态成员方法需要类对象调用,和对象有绑定关系。静态成员方法中【没有对象】tip:
static 修饰方法,对应的大括号是一个静态区域,静态区域中不可以直接使用非静态内容。4. 静态成员方法 在类文件加载阶段,加载到内存的【方法区】,已经具备执行能力,
所有和方法执行相关的内容全部准备就绪 修饰符,返回值类型,方法名,形式参数列表,方法体5. 静态成员方法和非静态成员方法执行哪一个效率高???
成员方法执行需要实例化对象支持
实例化对象过程
1. 占用一定的时间
2. 占用一定的内存空间
当前程序执行完成
1. 占用一定的时间进行销毁操作
2. 销毁过程中也需要和内存直接有数据交互。
静态成员方法执行有且只需要类名直接调用即可,没有类对象约束,节约了时间和空间6. 静态成员方法常用于工具类使用
工具箱 ==> 各种各样的工具