谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。
- 在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。
- 修饰类
-
当用final修饰一个类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
-
- 修饰方法
- 摘自《Java编程思想》第四版第143页:
"使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。"
因此,如果想明确禁止指定方法在子类中不被重写,就将该方法设置为final(类的private方法会隐式地被指定为final方法)
- 修饰变量:对于修饰为final的变量,它就不能再赋值。
-
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
上面的一段代码中,对变量i和obj的重新赋值都报错了。
- 如果是引用类型的变量,则在对其初始化之后便不能在赋值,但该对象行为不被final影响,也就是对象里面
-
public class Year {
private int year;
private String name;
public Year(int year, String name) {
this.year = year;
this.name = name;
}
public void setYear(int year) {
this.year = year;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Year{" +
"year=" + year +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
final Year year=new Year(1,"2");
System.out.println(year.toString());
year.setYear(3);
System.out.println(year.toString());
}
}
输出
Year{year=1, name='2'}
Year{year=3, name='2'}