JAVA编程思想(第4版)static关键字用法小结

来源:互联网 发布:歌曲升降调软件 编辑:程序博客网 时间:2024/06/13 10:53

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

static关键字的引出是为了以下俩种情形:

1.只想为某 特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。

2.希望某个方法不与包含它的类的任何对象关联在一起,就是说,即使没有创建对象,也能够调用这个方法。

而通过static关键字可以满足这俩个方面的需要。

当声明一个事物为static时,就意味着这个域或者方法不会与包含它的那个类的任何对象实例关联在一起。

所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问static域。

下面的源代码生成一个static字段,并对其初始化:

package test;public class StaticTest {static int i=47;}

现在创建一个Test类,在该类下创建俩个StaticTest对象,StaticTest.i也只有一份存储空间,这俩个对象共享同一个i。应用static变量有俩种方法一种是通过类名直接引用,一种是通过对象去定位它,st1.i与st2.i指向同一块内存空间,有相同值47,StaticTest.i++后也是有相同的值48。代码如下:

package test;public class Test {static StaticTest st1=new StaticTest();static StaticTest st2=new StaticTest();public static void main(String args[]){System.out.println("st.i:"+StaticTest.i);System.out.println("st1.i:"+st1.i+"st2.i:"+st2.i);StaticTest.i++;System.out.println("StaticTest.i++后");System.out.println("st.i:"+StaticTest.i);System.out.println("st1.i:"+st1.i+"st2.i:"+st2.i);}}

结果如图:


再举一个HasStatic的例子代码如下:

public class HasStatic { private static int x=100; public static void main(String args[]){ HasStatic hs1=new HasStatic();     System.out.println("hs1.x="+x);     hs1.x++;//编译器会提示应该以静态方式访问静态字段HasStatic.x;     System.out.println("hs1.x="+x);               HasStatic  hs2=new HasStatic();     System.out.println("hs2.x="+x);     hs2.x++;//编译器会提示应该以静态方式访问静态字段HasStatic.x;     System.out.println("hs2.x="+x);     hs1=new HasStatic();     System.out.println("x="+x);     hs1.x++;//编译器会提示应该以静态方式访问静态字段HasStatic.x;     System.out.println("x="+x);     HasStatic.x--;     System.out.println("x="+x);     }<strong>}</strong>
编译器会提示应该以静态方式访问静态字段HasStatic.x,即系统推荐直接通过类名访问,即HasStatic.x--这一句代码。这个例子更加显示了static字段的特征,在内存中只有一份存储空间,不管你new了多少个对象,所以创建出来的HasStatic 对象hs2它的x为101,因为hs1改变了它,即是它加1了。运行结果如下:


注意使用类名是使用static变量的首选方法。

创建一个Incrementable类,类中定义静态方法increment(),通过++将静态数据i递加,代码如下:

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

类似逻辑应用于静态方法,第一种方法是通过调用对象来调用,第二种方法是通过类直接调用,代码如下:

Incrementable sf=new Incrementable();sf.increment();System.out.println("st.i:"+StaticTest.i);System.out.println("st1.i:"+st1.i+"st2.i:"+st2.i);Incrementable.increment();System.out.println("st.i:"+StaticTest.i);System.out.println("st1.i:"+st1.i+"st2.i:"+st2.i);

最后总结:

1.static作用于某个字段,一个static字段对每个类来说只有一份存储空间,而非static字段是每个对象有一份存储空间。

2.static作用于方法的重要用法是不需要创建任何对象直接调用该static方法,这对于main()方法很重要。

3.static不能应用于局部变量。

4.Java中禁止使用全局方法,所以引入static方法通过类本身来直接调用。

0 0