简介
static修饰的内容不再属于单个对象,而是属于这个类和类绑定,并且单独存放。当这个类同时有很多个实例化的对象时其中一个修改了这个static修饰的属性时其他对象调用时值也会随着改变;
static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
● 在对象之间共享值时
● 方便访问变量时
静态属性属于某个实例化对象,如果在静态方法想使用这个非实例化属性可以先声明对象再进行引用,使用非静态方法也是需要先声明对象,使用对象进行引用
在引用某个静态属性时,可以使用类名.属性名进行引用,也可以使用对象进行调用但是不符合静态属性的思想。
静态属性在声明时只能存在对象的内部和方法平级,不能在方法内部声明静态属性。
静态属性只能在外层类,或者静态内部类中进行定义
静态方法作用
声明为static的方法有以下几条限制:
● 它们仅能调用其他的static 方法。
● 它们只能访问static数据。
● 它们不能以任何方式引用this 或super
静态方法可以通过类名直接调用,而不需要实例化类的对象。这样一些工具类里声明静态方法,用起来就比较方便。
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途
static和final
static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
static块
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。