文章目录
- 概述
- 特点与应用
- 注意事项
- 为什么一个静态方法中只能访问用static修饰的成员?
概述
Java中的static是一个修饰符(也可称关键字),可以用于修饰变量、方法和代码块。
特点与应用
static修饰的成员具有以下特点:
-
被类的所有对象共享
是我们判断是否使用静态关键字的条件 -
随着类的加载而加载,优先于对象存在
对象需要类被加载后,才能创建 -
可以通过类名调用
也可以通过对象名调用 -
静态变量(是类级别的变量):不属于任何实例对象,而是属于整个类,在内存中只有一份拷贝。被static修饰的变量也称为类变量或者静态变量。可以通过“类名.静态变量”的方式访问。
-
静态方法(是类级别的函数):不依赖于任何实例对象,使用时直接通过“类名.静态方法”的方式调用即可。静态方法只能访问其他静态成员(包括静态变量和静态方法),并且不能访问非静态的实例成员(如对象属性)。
-
静态代码块(用于初始化静态变量):在类加载时执行,且仅会执行一次。常用于初始化静态变量。
static修饰符的作用: -
实现数据共享:因为静态变量是类级别的,所以它们可以被所有对象共享。
-
方便访问:通过“类名.静态成员”的方式访问比创建对象再访问更加简单方便。
-
类工具:静态方法通常用于创建工具类或者实现算法,因为它们不依赖于对象状态。
-
初始化操作:静态代码块在类加载时执行,常用于初始化静态变量和执行静态方法。
注意事项
- 静态方法只能访问静态的成员
- 非静态方法可以访问静态的成员,也可以访问非静态的成员
- 静态方法中是没有this关键字
静态成员(包括静态变量和静态方法)可以直接访问类级别的数据,但不能访问实例级别的数据。原因是两者的生命周期不同,实例化对象时才能为其分配内存空间;而静态成员在类加载时就已经被生成,此时还没有对象建立。
静态成员只随所属类的变量和方法调用而加载,而非随着类的实例化而加载。
静态成员存放在类加载的静态存储区,在程序运行结束时回收。
在多线程环境下,由于静态成员共享,可能会发生并发问题,需要进行适当的并发控制处理。
为什么一个静态方法中只能访问用static修饰的成员?
1、静态数据成员在定义或说明时前面加关键字static。
2、静态成员初始化与一般数据成员初始化不同。
这表明:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
(2) 初始化时不加该成员的访问权限控制符private,public等。
(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
4、引用静态数据成员时,采用如下格式:
程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。因为静态是针对类的,而成员变量为对象所有。静态成员函数不属于任何一个类对象,没有this指针,而非静态成员必须随类对象的产生而产生,所以静态成员函数”看不见”非静态成员,自然也就不能访问了类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。