static的特点
1、 随着类的加载而加载
2、 优先于对象存在。
3、 被类的所有对象所共享
4、 可以通过类名调用,也可以通过对象名调用。
如
class Example{
static int a;
}
可以直接通过 Example.a来直接调用a。
5、静态方法只能访问静态成员变量和静态的成员方法,不能存在非静态的变量。
非静态的方法可以访问静态变量和非静态变量。
如
class student{
int a=10;
static int b=10;
public void show(){
//此两句话的含义相同第一句的a其实就是this.a
System.out.println(a);
System.out.println(this.a);
}
public static method(){
//此句会报错,因为a是非静态变量,静态方法随着类的加载而加载,但是this随着对象创建而创建的,静态方法先创建,不能访问为创建的this
System.out.println(a);
//此句不会报错,因为a是非静态变量,也是先被创建。
System.out.println(b);
}
}
6、
A、静态变量属于类,所以也成为类变量
成员变量属于对象,所以也称为实例变量(对象变量)。
B、静态变量存在与方法区的静态区,成员变量存储在堆内存。
C、静态变量随着类的加载而加载,随着类的消失而消失。
成员变量随着对象的创建而存在,随着对象的消失而消失。
D、静态变量可以通过类名调用,也可以通过对象调用
成员变量只可以通过对象名调用。
class Demo{
static int age;
public Demo(){
}
public Demo (int age){
this.age=age;
}
public void show(){
System.out.println(age);
}
}
class DemoTest{
public static void main(String args[]){
Demo a1=new Demo();
a1.age=10;
System.out.print("此处输出的是a1中的age:");
a1.show();
//如果Demo类中的age不是static类型的,a2中未对age进行赋值,会被初始化为0 输出结果为0
//如果Demo类中的age是static类型的,a2中未对age进行赋值,所以输出为a1的age值 输出结果为10
Demo a2=new Demo();
System.out.print("此处输出的是a2中的age:");
a2.show();
//如果设置Demo中的age为static类型,那么更改对象a2中的age就是对所有对象中的的age进行更改,所以最后a1,a2的age都为5
a2.age=5;
System.out.print("此处输出的是a1中的age:");
a1.show();
System.out.print("此处输出的是a2中的age:");
a2.show();
}
}
static的内存图解(此图为转载)