Java基础—关键字final

    final的意思是“这是不能被改变的”,基于设计和效率两大理由你可能希望阻止改变。final可能使用在data(数据)、methods(方法)、classes(类)三个地方。

Final data(类的属性或叫成员变量、方法的参数)

许多程序语言都提供某种机制,用来告诉编译器某块数据是“固定不变的”,不变的数据可能很有用,因为它:
1)可以是永不改变的“编译期常量(compile-time contents)”
2)可以在执行期(run-time)被初始化,而你却不想再改变它
    在Java中此类常量由关键字final修饰,定义时必须赋值,当final用于基本类型和对象引用(object references)时意义有很大不同;用于基本类型时,final让属性的值保持不变;当用于对象引用(object references)时,final让引用(reference)保持不变,即某个reference被初始化用以代表某个对象之后,便再也不能改变指向另一个对象,但对象本身的内容却是可以改变的。
    Java允许产生所谓“留白的finals”(Blank final),也就是允许我们将数据成员声明为final,却不给予初始值,但要求blank final必须在使用之前进行初始化,这一点是由编译器保证的。blank final对final关键字的使用提供了更多弹性,使class内的final数据成员可以在每个对象中有所不同,但依旧保持不变。
    Java允许将方法的参数声明为final,只要在参数前加final关键字即可,意味着你无法改变此参数(基本类型无法改变参数的值,对象类型无法指向另一个对象)。
分别用FinalData、BlankFinal和FinalArguments来说明final关键字在这三个方面的用法:
FinalData: 
 
BlankFinal:
 
FinalArguments:
 

Final methods(Final方法)

    使用final方法的原因有二:一是基于设计的考量,你希望某个函数的行为在继承过程中保持不变,而且无法被覆写;二是基于效率,声明为final的方法在被调用时允许编译器进行调用优化,编译器可以根据自己的判断来决定是进行正常的方法调用还是将方法体嵌入到方法调用的位置。
    class中的所有private方法都是final的,你无法在方法外调用private方法,也不能覆写它们。
    下面3个类用来演示final方法的用法:

Final classes(Final类)

    基于设计上或保密的考量,你可以将类声明为final,这样类的行为将不会被改变,也不能被继承。
    不论一个类是否被定义为final,其成员仍然遵循final data的规则,将class定义为final只不过是要杜绝继承的发生;由于final class中的方法无法继承,也不能够覆写,所以所有的方法都是final的。
    类FinalClasses和FinalClass来演示final class类成员变量与方法与final的关系:

 

告诫:不要轻易的将类或类的方法声明为final,因为我们很难预料类可能被重复运用的方式。

你可能感兴趣的:(Java基础—关键字final)