在java中,final关键字和static关键字一样,都可以用来修饰类,方法,成员变量,通常可以用来改善应用程序的性能,但是final强调的是“不可变性”。
1.修饰变量
final关键字可以用来修饰成员变量和方法中的变量。当一个数据被final和static同时修饰时,我们通常把它称为常量。
final的不可变性表现在:被final修饰的变量只能够进行一次赋值操作。
如图所示,当变量第一次被赋值后,就不可以在对其进行更改。
成员变量和方法中的变量有点区别,成员变量必须要进行初始化,而方法中的变量则不必。
对于在修饰成员变量时,只有3种情况可以对它进行赋值。
1.在声明时就进行赋值
2.在构造方法中进行赋值
3.将其加上static修饰符后,可以在static代码块中进行赋值
注意:对于基本数据类型来说,被final修饰后,指的是它的值不会发生改变,对于引用类型来说,被final修饰后指的是它的引用对象不会发生改变(即只能指向最初赋值的那个对象,不能够再更改),但是它引用的这个对象本身是可以改变的,因为引用的其实是一个地址,而这个地址虽然不会变,但地址中的内容可能会变。
class People{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Test{
public static void main(String[] args) {
final People people = new People();
people.setName("张三");
people.setAge(18);
System.out.println(people.getName());
System.out.println(people.getAge());
}
}
最后,由于final在一次赋值后就不会改变,所以如果在编译时就明确知道其值的话,编译器就会把它当做常量来处理,进行相应的优化,可以提高程序效率。
2.修饰方法
在方法前面可以使用final来修饰,一旦声明为final方法,则此方法不能够被子类所重写,但是可以重载。
注意:如果在父类中的final方法是用private修饰的,那么子类中是可以有同名的方法的,但是这里并不是重写,因为private不能被子类继承,所以其实是相当于在子类中有一个新的方法,恰好名字相同而已,这个方法是属于子类的,而不是从父类继承而来的。(注:private方法会被隐式的声明为final)
当我们不想要子类对方法进行重写时,通常会把方法声明为final,此外final方法通常在性能上会比普通方法好一点。
3.修饰类
被final修饰的类是不可以被继承的,常见的比如String类,他就是final类,是不可继承的。使用final类的好处是他们的对象是只读的,可以在多线程下安全的共享,不用额外的同步开销等。
注意:final类的所有方法都被隐式的声明为final方法。
总结
2.修饰方法:不能被重写,可以被重载。
3.修饰类:不能被继承。