final作为java中的非访问修饰符可用于修饰类,接口,变量,方法;
被final修饰的类:
final可以修饰类或者接口,但是没有类能够实现final修饰的类或接口。final修饰的类中所有的方法和变量都被隐式声明为final,
被final修饰的方法:
如果一个类中的方法被final修饰那么,该方法可以在该类中重载,也可以被子类继承。但是不能被子类覆写。
被final修饰的变量:
如果将引用类型(任何类的类型)的变量标记为 final,那么该变量不能指向任何其它对象。但可以改变对象的内容,因为只有引用本身是 final 的。引用存在于栈内存,对象存在于堆内存中,引用指向堆内存中指定对象的地址,只要指向的对象不变引用本身就不会变,这就是为什么对象本身属性可以变,但是对象地址不可变。
final Person p1 = new Person("zhangsan");
final Person p2 = new Person("lisi");
p1 = p2 ;//"编译时就会报错"
被final修饰的变量,方法,在编译的时候就会识别,在运行时就会有一个确切的内存用于存放(常量池),类似于static,实际上static被隐式声明为final。不同之处是static修饰的变量可以通过类名直接访问。
被final修饰的基本变量如 final int A = 2;被称之为常量,该类变量命名规则就是所有字符大写。该类变量不可以被修改值。(于static区别在于static可以被修改,但是任一一处修改,其他地方的该变量值也随之改变);
final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
final 修饰的局部变量可以只声明不赋值,然后再进行一次性的赋值。