一、static
- 被static修饰的成员变量和成员方法独立于该类的任何对象:不依赖于类特定的实例,被类的所有实例共享
- static对象可以在它的任何对象创建之前访问,无需引用任何对象:只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到它们
public static
本质上是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量
(一)static class与non static class的区别
静态对象 | 非静态对象 | |
---|---|---|
拥有属性 | 类共同拥有的 | 类各对象独立拥有的 |
内存分配 | 内存空间上是固定的 | 空间在各个附属类里面分配 |
分配顺序 | 先分配静态对象的空间 | 再对非静态对象分配空间 |
注!初始化顺序:先静态后非静态 |
(二)Java静态对象的好处
- 静态对象的数据在全局是唯一的,一改都改
若是想要处理的东西是整个程序中唯一的,设置为静态是个好方法。非静态的东西修改后只是修改了它自己的数据,不会影响其他同类对象的数据 - 引用方便
直接用类名.静态方法名 或 类名.静态变量名就可引用并且直接可以修改其属性值,不用get和set方法 - 保持数据的唯一性
此数据全局都是唯一的,修改它的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。有效减少多余的浪费 static final
用来修饰成员变量和成员方法,可简单理解为“全局常量”
对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖
二、final
静态变量、实例变量和局部变量,分别表示三种类型的常量(修饰的)
- final类:不能被继承、重写,没有子类,final类中的所有方法默认为final的
- final方法:不能被子类方法覆盖,但可以被继承(不可以被重写,但可以重载)
- final变量:即为常量,值不可变;基本数据类型变量:初始化后值不可变;引用类型:初始化后不能再让其指向另一个对象
- final对象:值可变,引用不变
- final:不能用于修饰构造方法
- private不能被子类方法覆盖,private类型的方法默认是final类型的
注:final空白:final变量定义时,可以先声明,但不给初值;无论什么情况,编译器都能确保空白final在使用之前必须被初始化
三、static final
用来修饰成员变量和成员方法,可以理解为“全局变量”
- 变量:值不可修改,类名可直接访问
- 方法:不可覆盖,类名可直接访问
注:被static和final修饰的实例变量,本身不能再改变;但,一些容器类型(如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,可以修改容器中存放的对象