面向对象二之final修饰符

final关键字用于修饰类、变量和方法。

final成员变量

final修饰的成员变量的值不能被修改,而且必须显式的指定初始值。
归纳起来,final修饰的类成员变量、实例成员变量能指定初始值的地方如下:
(1)类变量:必须在静态初始化块中或声明该变量时指定初始值。
(2)实例变量:必须在非静态初始化块、声明该变量或构造器中指定初始值。


image.png

final局部变量

系统不会对局部变量进行初始化,局部变量必须进行显式初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能对此变量赋值。


image.png

上面程序中示范了final修饰形参的情形,因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值。

final修饰基本类型变量和引用类型变量的区别

当使用final修饰基础数据类型变量时,不能对基础数据类型重新赋值,因此基础数据类型变量不能被改变,但对于引用数据类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用一个对象,但这个对象完全可以发生改变。


image.png

final方法

final修饰的方法不可以被重写。java提供的Object类中就有一个final方法:getClass(),因为java不希望任何类重新这个方法,所以使用final把这个方法封装起来,但对于该类提供的toString()和equals()方法,都允许子类重写,因此没有使用final修饰它们。


image.png

对于一个private方法,因为它仅在当前类可见,其子类无法访问该方法,所以子类无法重写该方法,如果子类中定义了一个与父类private方法有相同的方法名,方法参数,方法返回值,也不是方法重写,只是重写定义类一个新方法。


image.png

final类

final修饰的类不可以有子类,例如:java.lang.Math类就是一个final类,它不可以有子类。

当子类继承父类时,将可以访问到父类的内部数据,并可通过父类方法来改变父类方法的实现细节,可能导致不安全因素,破坏了封装。为了保证某个类不可被继承,则可以使用final修饰这个类:

public final class FinalClass{}
//下面的类定义将出现编译异常
class sub extends FinalClass{}

你可能感兴趣的:(面向对象二之final修饰符)