什么是Static?
Static表示静态, 用它修饰的成员变量和成员方法不依附于该类的任一对象实例, 随着类的加载被所有实例所共享.
静态变量
静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。在本类中, 可以在任何方法内直接访问静态变量, 在其他类中,可以通过类名访问该类中的静态变量。
什么时候使用静态变量?
当该变量在本类的每个实例(对象)中都是固定不变时, 可以将其声明为静态变量, 供多个实例共享, 节省内存
静态方法
特点与静态变量类似, 因为静态方法不需要通过它所属的类的任何实例就可以被调用, 因此static方法中不能用this和super关键字
静态方法:
静态方法属于类的层次(随类一起创建和回收),而不属于类的实例层次。因此,在静态方法内部,无法直接访问非静态字段或非静态方法,因为这些成员属于类的实例,而在调用静态方法时可能还没有创建任何实例。静态方法可以访问所有的静态字段和静态方法,因为这些成员也是类级别的。
若静态方法要使用非静态方法, 必须创建对应实例来间接访问非静态方法.
非静态方法:
非静态方法属于类的实例。这种方法可以直接访问类的所有成员,包括静态字段和静态方法,以及非静态字段和非静态方法。
非静态方法之所以能够访问静态成员,因为非静态方法是在特定的类实例上调用的,而这个实例可以访问类的所有成员,包括类级别的静态成员。非静态成员就更不用说了
什么时候使用静态方法?
若需要方便其他类调用该方法, 就可以设置为静态方法, 多用于工具类和测试类, 比如Math类中的方法都是静态方法
静态代码块
static{
}
该代码块会在类加载时就自动执行且仅执行一次,无论后面实例化几次,都不会再次执行。
什么时候使用静态代码块?
常用于类的初始化, 且仅需要一次