3要素: 数据类型 + 变量名 + 初始化值(以及作用范围)
--------------------------------------------------------------------------------
5. 修饰符 Modifiers
成员变量修饰符:
FieldModifier: one of
Annotation public protected private
static final transient volatile
局部变量修饰符:
VariableModifier: one of
Annotation final
变量与 final 修饰符
不被 final 修饰, 可以赋值多次, 初始化后还能改变其值.
被 final 修饰的变量, 只能赋值1次, 也即初始化后就不能改变其值
局部变量被内部类使用时必须被 final 修饰, 否则编译错误.
final 成员变量不会被编译器默认初始化, 必须手动初始化, 否则编译错误.
被 final 修饰的实例变量, 若声明时未初始化,
则(1)要么在构造代码块初始化(2)要么在每一个构造函数中分别初始化
被 final 修饰的类变量, 若声明时未初始化, 则必须在静态代码块中初始化.
一个类可以有多个构造代码块, 而各构造代码块按声明的顺序先后执行.
所以, 前面的构造代码块初始化了 final 实例变量, 后面的构造代码块才能使用,
而且后面的构造代码块不能再更改其值
静态代码块与构造代码块同理.
一个类可以有多个静态代码块, 而各静态代码块按声明的顺序先后执行.
所以, 前面的静态代码块初始化了 final 类变量, 后面的静态代码块才能使用,
而且后面的静态代码块不能再更改其值
final 变量为常量. 分为局部常量, 实例常量和类常量.
实例常量和类常量的名字应该按常量名的命名规则编写.
--------------------------------------------------------------------------------
6. 变量的初始化
变量必须被初始化后才能使用!!!
使用未被初始化的变量将导致编译错误
声明一个变量后, 必须用赋值语句对变量显示初始化, 千万不要使用未被初始化的变量.
成员变量的初始化
非 fianl 成员变量会被编译器默认初始化.
final 成员变量不会被编译器默认初始化, 必须手动初始化
对 final 成员变量的初始化见"变量与 final 修饰符"
局部变量的初始化
局部变量必须手动初始化.
而且, 声明局部变量时应立即初始化, 避免使用了未被初始化的变量导致编译错误.
对 final 局部变量的初始化见"变量与 final 修饰符"
public class Demo {
// 编译器不会自动初始化被 final 修饰的成员变量, 必须手动初始化
// private final String nationality; // 编译错误. final 成员变量必须手动初始化
private final String nationality = "cn";
public static void main(String[] args) {
// int num; // 局部变量定义时未初始化, 易出错
// System.out.println(num); // 编译错误: 使用未初始化的变量
int num = 5; // 局部变量定义时未初始化, 易出错
// System.out.println(num); // ok
}
}
--------------------------------------------------------------------------------
7. 变量的作用域
变量的作用域: 声明变量的一对{}之间.