static(静态)关键字的的出现主要是解决:资源浪费问题(内存浪费);实现共享;
static修饰的数据在内存中只维护一份。
被static修饰的数据在方法区中。
下图便于理解:
静态成员变量的特有访问方式:类名.属性名
而非静态的成员变量的访问方式:对象.属性名
使用static时要认真考虑,不能滥用。(只有数据需要共享时才能用static)
静态方法的访问方式:类名.方法名() , 而非静态方法不可以这样访问,只能用对象调用方法。
非静态方法可以直接访问静态成员与非静态成员(成员包括:成员变量和成员方法)
1静态方法 不能直接访问 非静态成员(成员包括:成员变量和成员方法)
因为静态方法执行的早,这时非静态的成员还没有加载进内存中,故无法访问
2静态方法中不能出现 this和super 关键字
因为静态的方法是可以使用类名调用的,this关键字代表了一个函数的调用者对象,这时候可能还没有对象的存在。
3 静态的数据是在对应的类文件加载进内存的时候执行的(静态代码块亦是这样)
即使不创建对象,静态代码块的代码也会执行
4静态的数据是优先于对象的存在的。
构造代码块加上static修饰就变成静态代码块了()
static {
代码......
}
静态的成员变量与非静态的成员变量区别:
1. 作用上的区别:
1. 静态的成员变量 的数据是共享的数据,在内存中只有一份。
2. 非静态的成员变量是一个对象的属性,在每个对象中都维护了一份。
2. 存储的位置区别:
1.静态的成员变量是存储在方法区中的。
2. 非静态的成员变量是存储在堆内存中。
3. 生命周期区别:
1. 静态成员变量是随着类文件 的加载而存在,随着类文件的卸载而消失。
2. 非静态成员变量是随着对象 的创建而存在,随着对象的消失而消失的。
静态成员变量优缺点:
静态的优点:
1.节省内存。
2. 调用方便。
缺点:生命周期太长。
下图便于理解: