final变量一旦初始化,则不允许修改
特点: 在构建对象是final属性必须进行赋值,不管采用的是直接赋值、非静态代码块赋值、构造器赋值三种方法中的哪一种,但是一旦被赋值则不允许对其进行修改。
例如:
class Test{
final String name = "申霄楠";
final String Id;
final Integer age;//初始化的同时可以直接赋值,也可以在代码块中进行赋值或者构造器中进行赋值
final Date birth;
{
//代码块,不管执行的是哪个构造器,这个代码块一定执行
age = 100;
}
public Test(){
birth = new Date();
name1 = "birth";
}
public test(String Id){
birth = new Date();
age = 99;//语法报错,已经赋值了
this.Id = Id;
//final属性也可以通过构造器的参数进行赋值,不是必须为字面量
}
public void func(){
name = "shenxiaonan";//报错,已经赋值不能对其进行修改
}
}
局部变量
局部变量要求声明的同时必须赋初值,也可以先声明后赋值,但是在变量使用之前必须进行赋值,同时一旦赋值便不能对其修改
public Test{
public static void main(String[] args){
}
}
//普通类
class Comman{
//成员属性
public void func1(int number){
final int num = 123;
final String str;
if(number%2==0)
str = "abc";
else
str = "123";
System.out.println(str);
}
public void fun2(final int num){
num++;//语法报错,在方法内部不允许进行修改
}
}
修饰方法
如果有final关键字修饰的方法,则不允许子类继承修改
class Common{
public final void func(){
System.out.println("Common.func()");
}
}
class SonCommon extends Common{//继承
public final void func(){//语法报错,final修饰的方法不能被继承
System.out.println("SonCommon.func()");
}
}
修饰类
当final关键字修饰的类时,该类不允许被继承
//不能被继承
final class Parent{
}
class Son extends Parent{
//语法报错
}
//要想被继承
final class Parent{
private Parent(){
}
private Parent(int age)[}
}
class Son extends Parent{
public Son(){
super(100);//调用Parent类中的Parent(int age){}这个构造器
}
}
注意由于String、StringBuffer、StringBuilder的类型是final,所以不可以通过继承的方式重新定义
修饰对象
public class Test{
public String name;
public int age;
public void setName(String name){
this.name = name;
}
public static void main(String[] args){
final Test test = new Test();//test存放的是Test对象的地址
test = new Test();//语法报错,不允许重新赋值
test.setName("beijing");//修改的是属性,而不是修改的test对象的地址
}
}
总结如下:
- final属性是修饰的变量可以在声明的同时进行赋值,也可以在构造器或者非静态代码块中进行赋值,一旦赋值不允许修改;
- final修饰的局部变量可以在声明的同时进行赋值,也可以在第一次使用之前进行赋值,一旦赋值则不允许修改;
- final针对复杂类型表示的是不允许修改引用,而不是不允许修改引用对象中的属性;
- final修饰方法,则这个方法不允许在子类中进行覆盖定义,子类中只能继承父类的final方法,但是不允许对继承来的父类方法进行重写;
- final修饰类,则这个类不能被其他类继承