目录
Java中static关键字的应用
static是Java中常用的关键字,代表全局
或者静态
的意思。
关于static的特征,我们可以理解为:方便在没有创建对象的情况下来进行某些操作。
通常可用于修饰成员变量和方法,也可以用于形成静态代码块。
实际应用中,可以将需要频繁操作
、通用型信息设置
、公共组件封装
等操作设置为静态。
static修饰成员变量与普通成员变量的对比
概念
- 静态成员:用static修饰的成员变量,通常也称为静态属性、类成员、全局属性等。
- 非静态成员:没有被static修饰的成员变量,也称为实例变量、实例成员、对象成员、对象属性等。
特征
- 静态成员:
- 静态成员是属于整个类的,由类所进行维护,仅在类初次加载时会被初始化,直到在类被销毁才回收。
- 通过该类实例化的所有对象都共享类中静态资源,任一对象对静态信息的修订,都将影响所有对象。
- 由于静态成员在类加载期间就已经完成初始化,存储在
Java Heap
(JDK7.0之前存储在方法区)中静态存储区,因此优先于对象而存在,可以通过类名和对象名两种方式访问(建议通过类名访问)。
- 非静态成员:
- 非静态成员属于对象独有,每个对象进行实例化时产生各自的成员,随着对象的回收而释放。
- 对象对各自成员信息的修订不影响其他对象。
- 只能通过对象访问。
应用
可以将频繁调用的公共信息、期望加快运行效率的成员设置为静态。但需要注意,由于其生命周期长,即资源占用周期长,要慎用。
static修饰成员方法与普通成员方法的对比
概念
- 静态方法:用static修饰的成员方法,通常也称为类方法、全局方法等。
- 非静态方法:没有被static修饰的成员方法,也成为实例方法,对象方法等。
特征
与静态成员类似,静态方法属于整个类的,由类所进行维护,优先于对象而存在,因此可以通过类名和对象名两种方式访问,也因此在静态方法中无法直接访问同类中的非静态成员。
static修饰代码块与构造代码块及普通代码块的对比
概念
- 静态代码块:被static修饰的,定义在类内部,用
{}
括起的代码段。 - 构造代码块:没有被static修饰的,定义在类内部,用
{}
括起的代码段。 - 普通代码块:定义在方法内部,用
{}
括起的代码段。
特征
-
静态代码块:
-
只能出现在类内,不允许出现在方法内。
-
可以出现多次,按顺序在类加载时执行。
-
无论该类实例化多少对象,只执行一次。
-
-
构造代码块:
- 可以在类内出现多次,按顺序在每个对象实例化时执行。
- 执行优先级:比静态代码块低,比构造方法高。
- 每次执行实例化对象时,均会执行一次。
-
普通代码块:
- 可以在方法内出现多次,按顺序在方法调用时执行。
应用
- 静态代码块:基于性能优化的考量,多适用于需要在项目启动时执行一次的场景,譬如项目资源整体加载等。
- 构造代码块:多适用于类中每个对象产生时都需要执行的功能封装。与构造方法的区别在于:构造方法是在new执行时有选择性的调用带参或者无参构造,而构造代码块则是,在每个对象实例化时都一定会执行。
- 普通代码块:适用于在方法内进行代码功能拆分。
除了上述三个应用,我们还需要注意的是:
- 不允许在方法内部定义静态局部变量
- 方法内定义的局部变量,作用范围为:自定义位置起,至方法结束,在此期间,不允许普通代码块内声明同名的局部变量。