Java Static 关键字详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Findyoulucky/article/details/88653152

通常来说,当创建类时,就是在描述那个类的对象的外观和行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。

有两种清醒用上述方法是无法解决的。一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。另一种情形是,希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能调用这个方法。

通过static这个关键字可以满足这两方面的需要。当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也能调用其static方法或访问其static域。

只需将static关键字放在定义之前,就可以将字段或方法设定为static。例如,下面的代码就生成了一个static字段,并对其进行了初始化:

class StaticTest{
	static int i=47;
}

现在,即使创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享一个i:

StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();

在这里,st1.i和st2.i指向同一存储空间,因此他们具有相同的值47。

引用static变量有两种方法。如前例所示,可以通过一个对象去定位它,如st2.i;也可以通过其类名直接引用,而这对于非静态成员则不行。

StaticTest.i++

使用类名是引用static变量的首选方式,这不仅是因为它强调了变量的static结构,而且在某些情况下,它还未编译器进行优化提供了更好的机会。

类似逻辑也应用于静态方法。既可以像其他方法一样,通过一个对象来引用某个静态方法,也可以通过特殊的语法形式ClassName.method()加以引用。定义静态方法的方式也和定义静态变量的方式详细:

class Incrementable{
	static void increment(){StaticTest.i++;}
}

可以看到,要调用Incrementable的increment方法,可以采用典型的对象来调用:

Incrementable sf =new Incrementable();
sf.increment();

或者,因为increment是一个静态方法,可以直接通过它的类调用:

Incrementable.increment();

尽管当static作用于某个字段时,肯定会改变数据创建的方式(因为一个static字段对每个类来说都是只有一份存储空间,而非static字段则是对每个对象有一个存储空间),但是如果static作用某个方法,差别却没有这么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。

和其他任何方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法常拿来负责看护与其隶属于同一类型的实例群。

猜你喜欢

转载自blog.csdn.net/Findyoulucky/article/details/88653152