P281-P
静态变量会在该类的任何静态方法执行之前就初始化。 静态项目的初始化有两项保证: 静态变量会在该类的任何对象创建之前就完成初始化。 静态变量会在该类的任何静态方法执行之前就初始化。
class Player{ static int playerCount = 0;//playCount会在载入类的时候被初始化为0 private String name; public Player(String n){ name = n; playerCount++; } }像是long或short等primitive主数据类型整数的默认值是0,primitive主数据类型的浮点数默认值是0.0,boolean是false,对象引用时null。
public class PlayerTestDrive{ public static void main(String[] args){ System.out.println(Player.playercount); Player one = new Player("Tiger Woods"); System.out.println(Player.playerCount);//静态变量也是通过类的名称来存取 } }如果你没有给静态变量赋值,它就会被设定默认值。 int会被设定为0。 静态变量的默认值会是该变量类型的默认值,就像实例变量所被赋予的默认值一样。
静态的final变量是常数 一个被标记为final的变量代表它一旦被初始化之后就不会改动。 也就是说,类被加载之后静态final变量就一直会维持原值。 以Math.PI为例: public static final double PI = 3.141592653589793; 此变量被标记为public,因此可供各方读取。 此变量被标记为static,所以你不需要Math的实例。 此变量被标记为final,因为圆周率是不变的。 此外没有别的方法可以识别为不变的常数(constant),但有命名惯例(naming convention)可以帮助你认出来。 常数变量的名称应该要都是大写字母!
静态final变量的初始化:
声明的时候: public class Foo{ public static final int FOO_X = 25;//注意这个命名惯例——应该都是大写的,并以下划线字符分隔 } 在静态初始化程序中: public class Bar{ public static final double BAR_SIGN; static{//这段程序会在类被加载时执行 BAR_SIGN = (double)Math.random(); } }也可以用final关键字来修饰非静态的变量,这包括了实例变量,局部变量或方法的参数。 不管哪一种,这都代表它的值不能变动。 但你也可以用final来防止方法的覆盖或创建子类。 final的变量代表你不能改变它的值。 final的method代表你不能覆盖掉该method。 final的类代表你不能继承该类(也就是创建它的子类)。
静态的方法应该用类的名称来调用,而不是用对象引用变量。静态的方法可以直接调用而不需要堆上的实例。静态的方法是一个非常实用的方法,它不需要特别的实例变量值。静态的方法不能存取非静态的方法。如果类只有静态的方法,你可以将构造函数标记为private的以避免被初始化。静态变量为该变量所属类的成员所共享。静态变量只会有一份,而不是每个实例都有自己的一份。静态方法可以存取静态变量。在Java中的常量是把变量同时标记为static和final的。final的静态变量值必须在声明或静态初始化程序中赋值: static{ DOG_CODE = 420; }常量的命名惯例是全部使用大写字母。final值一旦被赋值就不能更改。final的方法不能被覆盖。final的类不能被继承。