static关键字特点
- 随着类的加载而加载
- 优先于对象存在
- 被类的所有对象共享
class Person{
String name;
static String country;
}
class static{
public static void main(String[] args){
Person p1=new Person();
p1.country="中国";
Person p2=new Person();
System.out.println(p2.country); //由于country为静态所以输出p2.country的值同样为中国
}
}
- 可以通过类名调用
class Person{
String name;
static String country;
}
class static{
public static void main(String[] args){
Person.country="中国"; //合法
Person.name="日本"; //不合法
}
}
- 静态修饰的内容一般与类相关,类成员。
- 共性用静态,特性不用静态
static关键字的注意事项
-
在静态方法中是没有this关键字的。
在内存中静态是随着类的加载而加载,也就是说在对象存在之前静态就开辟了内存空间,而this是随着对象创建而存在的,静态优先于对象存在。 -
静态方法只能访问静态成员变量和静态成员方法,非静态方法既可以访问静态成员也可以访问非静态成员。
静态是优先于对象存在的,存在着静态方法已经加载但是没有创建对象的情况,这种情况下的非静态成员变量和非静态成员方法都是没有加载的,所以会出现调用错误。为了避免这种调用错误就规定静态只能访问静态。
class text_static{
int no_static=10;
static int y_static=20;
public void print1(){
System.out.println(no_static); //正确访问
System.out.println(y_static); //正确访问
}
static public void print2(){
System.out.println(no_static); //错误访问,静态不能访问非静态
System.out.println(y_static); //正确访问
}
}
静态变量和成员变量的区别
-
所属不同
静态变量属于类,称为类变量
成员变量属于对象,称为对象变量 -
内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存 -
内存中存活时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失 -
调用不同
静态变量可以通过类名和对象名调用
成员变量只能通过对象名调用