(1)提示:静态变量被类中的所有对象所共享,静态变量不能访问类中的实例成员。
(2)如果想让一个类的所有实例共享数据,就要使用静态变量(static variable),也成为类变量。静态变量将变量值储存在一个公共的内存地址。因为他是公共地址所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会受影响。
(3)静态方法和静态数据可以通过引用变量或他们的类名来调用。
(4)提示:使用类名 . 方法名(参数)的方式调用静态方法,使用“类名 . 静态变量”的方法访问静态变量。这会提高程序的可读性,因为可以很容易的识别出类中的静态方法和数据。
(5)因为静态方法和静态变量在类实例化之前就有,他们存在的时候可能没有实例对象,所以静态方法不能调用实例方法或者实例数据。(静态方法和变量不属于某个特定对象)
实例方法可以调用实例方法和静态方法,以及访问实例数据域和静态数据域。
设计指南:
如何判断一个变量或方法应该是实例的还是静态的?如果一个变量或方法依赖于类的某个具体实例,那就应该将它定义为实例变量或实例方法。如果一个变量或方法不依赖于类的某个具体实例,就应该将它定义为静态变量或方法。例如每个圆都有自己的半径,半径依赖于某个具体的圆。半径radius就是circle类的一个实例变量。
在Math类中没有一个方法是依赖于一个特定实例的,例如:random,pow,sin和cos。因此这些方法都是静态方法。
警告:
一个常见的设计错误就是将一个本应该声明为静态的方法声明为实例方法。例如:方法factorial(int n)应该定义为静态的,如下图所示,因为他不依赖于任何具体的实例。
public class Test{
public static int factorial (int n) {
for (int i = 1; i <= n; i++)
{
result += 1;
}
return result;
}
}