Java static - 静态(全局)方法与静态变量
2008-03-02 00:12Update
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() {
...
}
TestStatic.java
编译执行
代码中已经比较详细地加以解说,这里不再重复了。
如果你对类和对象的概念以及区别还不是很清楚,建议你先阅读下面的文章:
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
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
代码中已经比较详细地加以解说,这里不再重复了。
- Relative Articles
- Java String处理入门 - null或空值的判断处理 - (2008-03-04 15:44)
- Java面向对象入门之 类与对象的概念区别 - (2008-03-01 21:05)
- 初识Java语言的 assert关键字 - (2008-02-05 00:31)
- Java语言对properties资源文件的处理 - ResourceBundle类的用法 - (2008-02-05 00:05)
- 怎么向一个命令行Java程序传递参数 - Java入门之命令行参数传递 - (2008-01-31 20:59)
- Java语言的参数传递和处理方法 - 全面掌握Java参数传递与参数 - (2008-01-31 20:57)
- Java日期.时间处理之Date类 - 全面掌握Java里的日期处理 - (2008-01-31 20:53)
- Java基础之 Java注释 - (2008-01-26 15:35)
- Java基础之屏幕打印语句:print()/println() - (2008-01-26 14:46)
- Java语言的克隆与深层次克隆技术入门与精通 - (2007-11-13 17:44)
- Java的历史和发展 - (2007-11-13 00:29)
- Java语言里的包,类,接口 - (2007-11-13 00:27)
- 环境篇 - 构造Java开发环境 - (2007-11-13 00:24)
- Java语言的操作符 - (2007-10-23 11:36)
- Java语言里的数据类型,变量 - (2007-10-22 15:55)