static 关键字
把一个变量声明为静态变量通常基于以下三个目的:
- 作为共享变量使用
- 减少对象的创建
- 保留唯一副本
在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的。
static修饰表示静态的,在类加载时JVM会把它放到方法区,被本类以及本类中所有实例所公用。在编译后所分配的内存会在一直存在,直到程序退出内存才会释放这个空间。如果一个被所有实例公用的方法被申明为static,那么就可以节省空间了,不用每个实例初始化的时候都被分配到内存。
静态变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
-
静态变量在内存中只有一份拷贝,JVM只为静态分配一次内存,在类加载的过程中完成静态变量的内存分配。可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
-
实例变量,每次创建实例,都会对实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
- 所属不同,静态变量属于类,普通成员变量所有当前对象。
- 存储区域不同,静态变量存在方法区,普通成员变量存在堆。
- 生命周期不同,静态变量生周期与类相同;普通成员变量与当前对象相同。
- 序列化时,静态变量会被拆除在外。
静态方法
静态方法可以直接使用类名调用,静态方法中不能使用this、super,不能直接访问成员变量,成员方法,只能访问类下的静态变量、静态方法,因为实例成员和实例方法与当前对象关联,静态属于类。静态方法不能被抽象。
静态代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次
static块和static方法的使用区别
如果有些代码必须在项目启动的时候就执行,就需要使用静态代码块,这种代码是主动执行的;
需要在项目启动的时候就初始化但是不执行,在不创建对象的情况下,可以供其他程序调用,而在调用的时候才执行,这需要使用静态方法,这种代码是被动执行的。 静态方法在类加载的时候 就已经加载 可以用类名直接调用。
静态代码块和静态方法的区别是:
-
静态代码块是自动执行的。
-
静态方法是被调用的时候才执行的.
静态内部类和非静态内部类的区别:
-
静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
-
静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
-
非静态内部类会持有外部类的引用;静态内部类不会持有外部类的引用。