static关键字作为修饰符可以修饰变量也可以修饰方法,但都必须是成员变量或者是成员方法。
当成员变量或者成员方法被static关键字修饰时,该变量或者该方法不仅可以被本类对象调用,还可以被本类名调用,调用方法为:类名.成员变量(该变量被static修饰),或者类名.成员方法(该方法被static修饰)。
一个成员变量或者成员方法被static关键字修饰之后,该成员变量被称为静态成员变量或者类变量,该方法被称为静态成员方法或者类方法,而其他的非静态成员变量又被称为实例变量;该成员变量或者成员方法具有以下特点:
1、随着类的加载而加载,也就是说静态变量或静态方法随着类的消失而消失,说明它的生命周期最长,而其他的非静态变量或非静态方法是随着实例(对象)的创建才被加载的。
2、优先于类的对象存在,也就是说静态成员在对象创建之前就存在了的,而非静态成员是在对象创建后才可以使用的。
3、被所以对象所共享。
4、可以直接被类名所调用。
类变量和实例变量的区别:
1、存放位置:
类变量随着类的加载而存在于方法去中;
实例变量随着对象的创建而存在于堆内存中;
2、生命周期:
类变量生命周期最长,随着类的消失而消失;
实例变量生命周期随着对象的消失而消失。
使用static消失成员时注意的事项:
1、静态方法只能访问静态成员,非静态方法既可以访问静态成员也可以访问非静态访问;
2、因为静态成员优先于对象存在,所以静态方法中不可以出现this关键字;
3、主函数就是静态的。
那么既然了解了静态成员的特点了,我们该什么时候使用静态呢?
什么时候使用静态成员变量?
当对象中出现共享数据时,就使用静态,而对象的一些特有属性定义成非静态,存放在堆内存中。
什么时候使用静态成员方法?
当方法中没有访问到非静态数据时,那该方法就可以定义成静态方法。
所以使用静态成员有利也有弊:
好处是对对象的共享数据进行单独空间的存储,这样就可以节省空间,也就没有必要对每一个对象中都存储一份共享数据,另外还可以直接使用类名调用。
缺点是生命周期过长,而且访问出现局限性(因为静态方法只能访问静态成员)。