static用来修饰成员变量 和 成员方法
static修饰成员变量的作用:
1、被称为静态的成员变量
2、所有该类的对象共享该变量,无论创建多少个对象 该变量在内存中只有一份。
3、静态成员的生命周期不依赖于对象,而是依赖于类
4、在类加载的时候分配内存空间
5、静态的成员变量不建议使用对象去访问 而是使用类名来访问
6、静态的成员变量在方法区中分配内存。
一般情况下 终态变量 用static修饰 因为终态的值只能被读取 不能被修改,在内存中只有一份就行
类加载:
Person person = new Person();
先看Person是否被加载过,没有加载,那么立即加载Person。将Person类的字节码信息加载到方法区中。
加载一共分为三步(装载、链接、初始化)在加载的最后一步 为静态的成员变量赋初值初始化。加载完毕后,才能创建相应的对象。如果Person的字节码已经被加载了 就直接创建对象
类只加载一次 static成员也只进行空间分配一次。
static修饰方法的作用:
1、不依赖于任何对象,直接通过类名来调用。用来写工具方法。
静态的成员方法比普通的成员方法效率要快一些。
注意:在类中定义方法,能使用局部变量尽量使用局部变量。比成员变量的效率高。
2、static修饰的方法 可以用来访问类的静态的其他的成员
思考:
1、为什么静态方法不可以访问类的实例变量?
实例变量从属于对象,静态方法从属于类,静态方法在没有创建对象的时候就可以被调用,这个时候实例变量还没有分配空间。
2、静态方法中为什么不能有this?
this指向一个对象的引用,而静态方法被调用时 对象可能还没被创建 没分配空间。所以不可以。
3、类的实例方法中是否可以访问静态成员?
可以,实例方法属于对象,调用实例方法时 对象已经被建立 说明类早已经被加载了,所以静态成员早已经初始化分配了空间,访问是安全的。