Java static - 静态(全局)方法与静态变量

2008-03-02 00:12Update
TAGS: java | static | 全局

LifevV.COM编辑部

Java语言可以使用static关键字修饰类的成员变量和成员方法。被static修饰的成员变量,成员方法一般被称为静态(或者全局)变量(static field),静态方法(static method)。

本文介绍Java static的概念与使用方法。

如果你对类和对象的概念以及区别还不是很清楚,建议你先阅读下面的文章:
Java面向对象入门之 类与对象的概念区别


有别于一般的变量和方法,静态变量,静态方法的作用域是类的所有对象。也就是说,当运行时,在程序空间中,类的所有对象访问到的静态变量都是同一个值,当其中一个对象改变了静态变量的值,其他对象都将受到影响。

正因为这样,静态变量,静态方法可以(建议)通过 类名.静态变量/类名.静态方法 直接存取。

对象.变量/方法


没有使用static修饰的成员变量,成员方法是作用于对象域的,通常被称作对象变量(instance field),对象方法(instance method)。当某个对象被创建时,它们才真正地存在于内存空间之中,而且对象本身对它们的改变,不会影响到其它对象。就好像 Person的一个对象zhangsan,zhangsan的改变不会影响到其它Person对象一样。


对象.变量/方法 定义例:
private String name;

private void someMethod() {
...
}


类.变量/方法


使用static修饰的成员变量,成员方法可以看作类的固有的,它作用于类的全体对象。当类的所有对象需要共享同一值时,可以使用static来定义。

例如,一个店铺(类),拥有多个分店(对象),便可以使用一个static变量来描述所有店的总营业额,这样每一个分店可以简单地访问(读/写)到公用的店的总营业额。

又如,PI=3.1415926,这时可以使用static来定义PI变量。当然,通常这种不希望改变static变量的情况,一般使用static final来修饰。


类.变量/方法 定义例:

private static long saleAccount;
private static float PI = 3.1415926;

private static void someMethod() {
...
}


Java static范例


TestStatic.java
public class TestStatic {
    private static String staticValue = "";
    @SuppressWarnings("unused")
    private String value;
    
    public TestStatic() {
        super();
    }

    @SuppressWarnings("static-access")
    public static void main(String []args) {
        //直接使用 类名.静态方法名()
        System.out.println("TestStatic.staticValue");
        TestStatic.setStaticValue("static value");
        
        TestStatic t1 = new TestStatic();
        TestStatic t2 = new TestStatic();

        //t1, t2存取到的值应该是一样的
        System.out.println("from t1:staticValue=" + t1.getStaticValue()
        System.out.println("from t2:staticValue=" + t2.getStaticValue());
        //通过对象t1改变static变量
        System.out.println("t1.staticValue");
        t1.setStaticValue("t1");
        //t1, t2存取到的值应该是一样的
        System.out.println("from t1:staticValue=" + t1.getStaticValue());
        System.out.println("from t2:staticValue=" + t2.getStaticValue());

        //通过对象t2改变static变量
        System.out.println("t2.staticValue");
        t2.setStaticValue("t2");
        //t1 受到影响
        System.out.println("from t1:staticValue=" + t1.getStaticValue());
    }
    
    public static String getStaticValue() {
        return staticValue;
    }
    
    public static void setStaticValue(String staticValue) {
        //直接通过 类名.静态变量 存取
        TestStatic.staticValue = staticValue;
    }
    
    public String accessStaticValue () {
        value = staticValue;    //普通的方法可以存取static 方法或 static变量
        
        return staticValue;
    }
}


编译执行
C:\>javac TestStatic.java

C:\Java>java TestStatic
TestStatic.staticValue
from t1:staticValue=static value
from t2:staticValue=static value
t1.staticValue
from t1:staticValue=t1
from t2:staticValue=t1
t2.staticValue
from t1:staticValue=t2


代码中已经比较详细地加以解说,这里不再重复了。
 
Copyright ©2006-2010 lifevv.com. All Rights Reserved
POWERED BY @pmplat.syboos.com