文章目录
前言
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用,我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
一、static关键字作用
- 为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关
- 实现某个方法或属性与类而不是对象关联在一起,也就是说在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性
二、使用情况
1.修饰成员(成员变量和成员方法)
- 随着类的加载而加载(随着类的消失而消失),说明它的生命周期最长
- 早于对象存在(明确静态是先存在的,对象是后存在的)
- 被所有对象所共享(节约空间)
- 除了可以被对象调用外,还可以直接被类名调用
代码如下:
package 静态;
/**
* @BelongsProject: untitled
* @BelongsPackage: 静态
* @Author: mcc
* @CreateTime: 2020-08-22 08:34
* @Description:
*/
public class StaticTest {
public static void main(String[] args) {
Chinese c1 = new Chinese();
c1.name = "张三";
c1.age = 18;
c1.nation = "CHN";
Chinese c2 = new Chinese();
c2.name = "李四";
c2.age = 20;
c2.nation = "CHINA";
System.out.println(c1 + "--" + c1.nation);
System.out.println(c2 + "--" + c2.nation);
}
}
class Chinese {
static String nation;
String name;
int age;
@Override
public String toString() {
return "Chinese{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
说明:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
2.修饰代码块(静态块)
3.修饰内部类(静态内部类)
三、实例变量和类变量的区别
存放位置 | 生命周期 | |
---|---|---|
实例变量 | 堆内存 | 实例变量生命周期随着对象的消失而消失 |
类变量 | 方法区 | 类变量的生命周期最长,随着类的消失而消失 |
四、静态方法使用注意事项
- static方法中不能使用this和super关键字
- 不能调用非static方法,只能访问所属类的静态成员,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。
五、静态的利与弊
- 利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份。可以直接被类名调用。
- 弊端:生命周期过长。访问出现局限性(静态虽好,只能访问静态)
六、什么时候使用静态
1.什么时候定义静态变量?
- 属性是可以被多个对象所共享的,不会随着对象的不同而不同的
- 类中的常量也常常生命为静态的
- 对象中的特有数据要定义成非静态存在于堆内存中
2.什么时候定义静态方法?
- 操作静态属性的方法,通常设置为静态
- 工具类中的方法,习惯上声明为静态方法。比如Math、Arrays、Collections