Static 关键字
我们都知道创建类就是对一个类对象的外观与行为的描述,通常情况下只有用 new 创建类对象的时候才能真正分配到数据存储空间,外界才能真正调用起方法。但是有两种情况特殊:
1. 只想为某特定区域分配单一存储空间,不考虑创建多少对象,甚至不创建任何对象。
2. 希望某方法不与所在类的任何对象关联在一起。即使没有对象,也能被外界调用。
我们都知道普通的方法和域必须知道他们一起运作的特定对象。但是由于static 关键字修饰的域或者方法不与所在类的任何对象实例关联,所以 static 可以满足这两方面的需求。
static 修饰的域或者方法既可以像普通域或者方法那样通过对象定位。也可以直接通过类名直接引用。非静态成员则不可。而且一般推荐使用类名直接引用,不仅可以强调变量的 static 结构,还有利于编译器进行优化。
// 类对象定位
ClassA aClass = new ClassA();
aClass.a;
// 类名直接引用
ClassA.a ;
另外,static 作用于某字段时会改变数据创建的方式,因为 static 修饰的关键字对于每个类对象都只有一个存储空间,而非静态字段则是每个对象都有一个存储空间。但是 static 作用于某个方法差别却不是很大,static 方法的重要用法在于不创建任何对象的情况下调用。
static 与 this 关键字
这里需要简单介绍一下 this 关键字的一些特性。this 关键字主要用于在方法内部获得对当前对象的引用,而这个引用是编译器“偷偷”传入的没有特殊标识符。this 的用法与其他对象的引用并无不同,只是若在方法内部调用同一个方法的另一个方法则不必使用。见过太多人编码风格习惯全部加上 this,看着也是难受。另外 this 也用于将对象传递给其他方法或者在构造器中调用构造器时使用(后者有些限制,这里不多解释)。
而 static 就是没有 this 的方法,因为 static 内部不能调用非静态方法。static 修饰的方法很像是全局方法, java 中不允许设置全局方法,但是类中置入 static 方法就可以访问其他类的 static 域和方法。