1.内存分配:
静态变量在应用程序初始化时,即是在类被加载的时候成员变量即被初始化,就存在于内存当中,直到它所在的类的程序运行结束时才消亡; 而非静态变量需要被实例化后才会分配内存。非static修饰的成员变量是在对象new出来的时候划分存储空间,是与具体的对象绑定的,该成员变量仅为当前对象所拥有的。
静态方法和静态变量创建后始终使用同一块内存,是连续的。
非静态方法会存在于内存的多个地方,是离散的。
static修饰的变量在加载的时候先于main方法加载在内存中的数据共享区——-方法区,而非static的变量在加载的时候,是要创建变量才加载在堆内存中的。
一个static变量单独划分一块存储空间,不与具体的对象绑定在一起,该存储空间被类的各个对象所共享。static变量值在方法区加载一次,而非static在创建对象时会加载很多次。每次创建都会拷贝一份。
2.生命周期:
静态变量生存周期为应用程序的存在周期; 非静态变量的存在周期取决于实例化的类的存在周期。
3.调用方式:
静态变量只能通过“类.静态变量名”调用,类的实例不能调用;非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
对象在引用成员变量是直接通过类名.变量名调用,对象在引用实例变量时只能通过对象名.变量名调用。
在类中调用成员变量时直接调用或者以类名.变量名方式调用,实例变量则用this或者直接调用。
4.共享方式 :
静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值,线程安全的; 非静态变量是局部变量,不共享的,线程非安全的。
5访问方式 :
静态成员不能访问非静态成员; 非静态成员可以访问静态成员。