final 修饰符
final 可修饰
-- 变量:成员变量(类变量和实例变量)和局部变量(方法里的局 部变量和代码块的局部变量)
-- 方法
-- 类
【final 修饰变量】
★final修饰成员变量
-- Java 成员变量(Field),默认是可以由系统执行初始化,程序员可以不指定初始值。
1.final修饰实例变量,可在以下3个地方为实例变量指定初始值:定义时指定初始值、初始化块、构造器;
最多只能指定一次初始值,普通方法不允许为final实例变量赋值;
2.final修饰类变量,可以在以下2个地方为类变量指定初始值:定义时指 定初始值、类(静态)初始化块;
最多只能指定一次初始值,普通类方法、普通方法、普通初始化块不能 为final类变量赋值;
★final修饰局部变量
-- Java 的局部变量,默认 必须由程序员类指定初始值
★final修饰的变量,会被执行“宏替换”
-- final修饰的变量,声明时就指定了初始值,而且初始值在编译时就可 以确定,因此可以说这个变量不存在。(所谓“不存在”,就是执行了 “宏替换”--即“查找、替换”);
例如:
class Final
{
public static void main(String[] args)
{
final String s1 = "Hello";
final String s2 = " Java ";
final String s3 = "World!";
final String s4 = s1 + s2 + s3;
//所以以上代码实际上定义了0个变量、1个对象
//这个对象就是 “Hello Java World!”
}
}
所以以上的代码完全可以等于
class Final
{
public static void main(String[] args)
{
System.out.println("Hello Java World!");
}
}
对这个例子,可以用 “Java -c 类名”命令来查看,查看的结果是二者完全一样。
★final方法
-- final修饰的方法不能被重写(Override),其作用在于:禁止父类方法被重写,避免了父类被破坏;
-- 因为private修饰的方法不能被重写,因此虽然final和private可以一起修饰方法,但是实际意义不大;
★final类
-- final 类不能有子类
-- final 修饰类是为了更加安全,由于没有子类,所以final类的方法和
field就可以被更好的保护;
-- 典型的,Java中的Strin、Math和所有包装类都是final类。