static 关键字的理解
通常来说,当创建一个类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。当执行new来创建对象时,数据存储空间才会被分配,其类中的方法才供外界调用。
有两种情形用上述方法是无法解决的。
- 一种情形是,只想为某个特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。
- 另一种情形是,希望某个方法不与包含它的类的任何对象关联在一起。
也就是说,即使没有创建对象,也能够调用这个方法。
如何解决这两种情形呢?通过static关键字可以满足这两方面的需要。
当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例相关联。也就是说,即使从未创建某个类的任何对象,也可以调用其static方法或访问static域。
==注意==: 通常我们访问某个类的方法或数据,非static域或方法必须与某一个特定对象关联。由于在用static方法前不需要创建任何对象,所以对于static方法,不能简单的通过调用其他非static域或方法而没有指定某个命名对象,来直接访问非static域或方法。
如何使用static关键字呢?只须将static关键字放在定义之前。
public class StaticTest {
static int i = 47;
}
创建两个StaticTest 对象
StaticTest staticTest1 = new StaticTest();
StaticTest staticTest2 = new StaticTest();
根据上述的理解,用static修饰的事物,会分配到一个特定的存储空间中,而不是两个StaticTest对象分配的存储空间,也就是说StaticText.i 只有一个存储空间,这两个对象共享同一个i.
StaticTest.i ++;
staticTest1.i 和 staticTest2.i 都变成了48
总结
尽管static作用于某个字段时,肯定会改变数据创建的方式,因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是每个对象有一个存储空间,static常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。
扩展及应用
理解了static关键字,通常会用于定义一个全局的变量或作用于一个类、作用于方法。
作用于类的最常见的就是单例模式,常见的单例模式,用static作用于这个类,这个类只需实例化一次。
public class StaticTest {
private static StaticTest instance;
public static StaticTest getInstance(){
if (instance == null){
synchronized (StaticTest.class){
if (instance == null){
instance = new StaticTest();
}
}
}
return instance;
}
}
网友评论