P281-P
《Head First Java》20201003读书笔记
静态变量的起始动作
静态变量会在该类的任何静态方法执行之前就初始化。
静态项目的初始化有两项保证:
静态变量会在该类的任何对象创建之前就完成初始化。
静态变量会在该类的任何静态方法执行之前就初始化。
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的变量代表你不能改变它的值。
final的method代表你不能覆盖掉该method。
final的类代表你不能继承该类(也就是创建它的子类)。
- 静态的方法应该用类的名称来调用,而不是用对象引用变量。
- 静态的方法可以直接调用而不需要堆上的实例。
- 静态的方法是一个非常实用的方法,它不需要特别的实例变量值。
- 静态的方法不能存取非静态的方法。
- 如果类只有静态的方法,你可以将构造函数标记为private的以避免被初始化。
- 静态变量为该变量所属类的成员所共享。静态变量只会有一份,而不是每个实例都有自己的一份。
- 静态方法可以存取静态变量。
- 在Java中的常量是把变量同时标记为static和final的。
- final的静态变量值必须在声明或静态初始化程序中赋值:
static{
DOG_CODE = 420;
} - 常量的命名惯例是全部使用大写字母。
- final值一旦被赋值就不能更改。
- final的方法不能被覆盖。
- final的类不能被继承。