# static 详解
# 修饰范围:
- 变量:称为类变量、静态变量
- 方法:称为类方法、静态方法
- 代码块:称为静态代码块
- 嵌套类:称为静态内部类
# 静态变量:
类的成员可以分为俩种:
- 静态变量(类变量),指被static修饰的成员变量
- 实例变量,指没有被static修饰的成员变量
区别:
- 静态变量
- 远行时,Java虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配
- 在类的内部,可以在任何方法内直接访问静态变量
- 在其他类中,可以通过类名访问该类中的静态变量
- 示例变量
- 每创建一个实例,Java虚拟机就会为实例变量分配一次内存
- 在类的内部,可以在非静态方法中直接访问实例变量
- 在本类的静态方法或其他类中则需要通过类的实例对象进行访问
静态变量作用:
- 静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据。
- 如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。
# 静态方法
成员方法也分为俩种:
- 静态方法(类方法),指被static修饰的成员方法
- 实力方法,指没有被static修饰的成员方法
区别:
- 静态方法属于类而不属于类的对象
- 它通过类被直接调用,无需创建类的对象
- 静态方法中,不能使用this关键字,也不能直接访问所属类的实例变量和实例方法
- 静态方法中,可以直接方法所属类的静态变量和静态方法
- 同this关键字,super关键字也与类的实例相关,静态方法中不能使用super关键字
- 实例方法,可直接访问所属类的静态变量、静态方法、实例变量和实例方法。
# 静态代码块
静态代码块,是Java类中的static{}修饰的代码
作用:用于类初始化时,为类的静态变量赋初始值,提高程序性能
特点:
- 静态代码块,有点类似于一个方法,但不可以存在于任何方法体内
- 静态代码块,可以置于类中的任何地方,类中可以有多个静态初始化块
- Java虚拟机在加载类时执行,将只需要一次初始化的操作放在static代码块
- 类中包含多个静态代码块,Java虚拟机将按他们在类中出现的顺序依次执行,且都执行一次
- 静态代码块,不能直接访问类的实例变量和实例方法,需通过类的对象访问
# 静态类
Java中一个类被声明为static的,只有一种情况,就是静态内部类。如在外部声明为static的。编译不会通过
- 静态内部类,跟静态方法一样,只能访问静态成员变量和方法,不能访问非静态方法和属性。
- 普通内部类,可以访问任意外部类的成员变量和方法。
- 静态内部类,可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
- 静态内部类,可以单独初始化。