final关键字在Java中指的是"没法改变的"。它做为数据,方法和类的修饰符号有以下做用。spa
数据以final修饰来告知编译器这是一块恒定不变的数据,好比:code
1)一个永不改变的编译时常量对象
2)一个不但愿被改变的运行时初始化的值blog
对于永不改变的编译时常量,编译器可能将该常量值直接代入计算式中继承
final int MAX = 20;
一般使用大写,多个单词如下划线分隔,其效果(不考虑做用域)可类比于c语言中的:作用域
#define MAX 20
与static联用,该域将占据一个不能改变的存储空间。编译器
static final int MIN = 0;
修饰的对象引用不可改变,即一旦引用被初始化指向一个对象,就不能再把它改变指向另外一个对象。一个误区是,引用的对象自己不能改变。编译
public class Test { public static void main(String args[]){ final Person s1 = new Person(); Person s2 = new Person(); //s1 = s2; 报错,缘由是s1是final修饰的对象引用 s2 = s1; //正确运行 s1.name = "Sakura"; //正确运行 } } class Person{ public String name = "sakura"; }
一般来讲,修饰方法是为了把方法锁定,防止任何继承类修改它的含义。class
class Person{ String name = "sakura"; public final void print(){ System.out.printf(name); } } class Student extends Person{ public void print(){ //报错,没法经过编译 System.out.printf(name); } }
在方法参数列表中以声明的方式将参数指定为final,表明在方法中没法改变参数指引的对象。引用
class Person{ public void print(final String str){ str = "sakura"; //没法经过编译,去掉final则正常运行 System.out.println(str); } }
将某个类总体定义为final,即表明该类不能被继承。
final class Person{ String name = "sakura"; public final void print(){ System.out.printf(name); } } class Student extends Person{ //没法经过编译 }
注意,类被final修饰,不表明类中的域被final修饰,类中的域不被final修饰就表明该域能够被修改;即它的可修改性与类是否有final修饰无关。
public class Test { public static void main(String args[]){ Person s1 = new Person(); s1.name = "Sakura"; //运行正常 } } final class Person{ String name = "sakura"; public final void print(){ System.out.printf(name); } }
容许生成空白final,即未给定初值得final域;final修饰类中的某个域时,必须保证该域在定义时初始化或在构造器中被初始化。
class Person{ final String name; Person(){ name = "sakura"; } }