一、final关键字修饰类
final关键字可以修饰一般类,但是不能修饰抽象类和接口;其中被final修饰的类不可被继承。
//错误案例,下面这个在类验证阶段就会出错
public final class Father {
}
class Son extends Father{
}
//final不能修饰抽象类、编译时报错
public final abstract class FinalAbstractClassTest {
}
//final不能修饰接口、编译时报错
public final interface FinalAbstractClassTest {
}
二、final修饰方法
被final修饰的方法不能被子类覆写,否则会编译出错
//Man覆写了父类的被final修饰的方法,编译时报错
public class Human {
public final void sayHello(){
}
}
class Man extends Human{
@Override
public final void sayHello(){
}
}
final不能修饰抽象类的抽象方法和接口中的方法
//错误案例final不能修饰接口中的方法
public interface FinalAbstractClassTest {
public final void sayHello();
}
//错误案例:final不能修饰抽象方法
public abstract class FinalAbstractClassTest {
public final abstract void sayHello(){}
}
一、final修饰变量
final 关键字修饰成员变量
被final修饰的成员变量要么我们显示的为该变量初始化值,或者用构造器方法进行初始化,否则会出错;而且一旦赋值,变不能再修改值或者是引用(不能有setters方法)。
//正确方式一
public class FinalClass {
public final int a;
public FinalClass(int a) {
this.a = a;
}
}
//正确方式二
public class FinalClass {
public final int a = 1;
public FinalClass() {
}
}
//错误的是final修饰的成员变量不能有setter方法
public class FinalClass {
public final int a;
public FinalClass(int a) {
this.a = a;
}
//错误原因是不能被改变
public void setA(int a){
this.a = a;
}
}
final修饰一般变量
如果final修饰的是基本类型的变量,那么一旦复制,就不能再更改值,如果final修饰的是引用变量,那么一旦指明变量的引用地址,就不能再更改。
//错误案例:不能修改被final修饰的基本变量变量
public class FinalClass {
public static void main(String[] args) {
final int i = 1;
i++;//
}
}
//错误案例:不能将final修饰的引用变量重新指向新的对象
public class FinalClass {
public static void main(String[] args) {
final Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map = new HashMap<Integer, Integer>();//错误
}
}
/*正确案例:被final修饰的变量只是不能被修改引用指向其他新的地址,
** 但是可以改变引用对象中属性的值(前提是这个属性不是final修饰的)
*/
public class FinalClass {
public static void main(String[] args) {
final Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0;i<3;i++){
map.put(i,i);
}
}
}
总结:
- final修饰类:final关键字可以修饰一般类,但是不能修饰抽象类和接口;而且被final修饰的类不可被继承
- final修饰方法:被final修饰的方法不能被子类覆写,否则会编译出错;final不能修饰抽象类的抽象方法和接口中的方法
- final修饰成员变量:被final修饰的成员变量要么我们显示的为该变量初始化值,或者用构造器方法进行初始化,否则会出错;而且一旦赋值,变不能再修改值或者是引用(不能有setters方法)
- final修饰一般变量:如果final修饰的是基本类型的变量,那么一旦复制,就不能再更改值,如果final修饰的是引用变量,那么一旦指明变量的引用地址,就不能再更改;但是我们可以更改引用对象的成员变量非final的值。