一直都知道final修饰的类不能被继承,但是不知道为什么不能被继承!
2017-08-09 08:59
429 查看
首先你要知道自己为什么要用final,用final干什么!
当你将final用于类身上时,一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要
进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final
类中的方法加上一个final,但这显然没有意义。
采用final方法的第二个理由是程序执行的效率。将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个final方法调用,
就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。
相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码
所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。Java编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final方法。然而,最好还是不要
完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。类内所有private方法都自动成为final。由于我们不能访问一个private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。
可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。
final方法 之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持 不变,而且不可被覆盖或改写,就可以采取这种做法。
这是final的规定
当你将final用于类身上时,一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要
进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final
类中的方法加上一个final,但这显然没有意义。
采用final方法的第二个理由是程序执行的效率。将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个final方法调用,
就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。
相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码
所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。Java编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final方法。然而,最好还是不要
完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。类内所有private方法都自动成为final。由于我们不能访问一个private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。
可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。
final类 如果说整个类都是final(在它的定义前冠以final关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类 肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。
相关文章推荐
- java类方法继承为什么其修饰词的范围不能越来越小
- 一直都知道string不用new,但是不知道是为啥
- 通讯录的录入与显示(从相似度0.98到后来成功,但是不知道为什么,后来知道错在了生日01月的表示方法上了)
- java类方法继承为什么其修饰词的范围不能越来越小
- [转]构造函数为什么不能被abstract/static/final/native/stricftp/synchronized修饰 及 一些关键字的用法
- final修饰的变量是引用不能改变,还是引用的对象不能改变
- 为什么内部类调用外部变量,外部变量必须用final修饰
- c++设计一个类,但是不能被继承
- 还不能成功,暂还不知道为什么会这样错的。
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 今天无意中发现JavaBean类基本都要求实现了Serializable接口,以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取,但不知道为什么需要序列化,今天总结一下
- 你知道江小白,却不知道它为什么能火?
- 为什么内部类访问的外部变量需要使用final修饰
- 为什么类的定义中不能包含其自身类型,但是能包含其自身的指针或引用类型
- 为什么内部类访问的外部变量需要使用final修饰
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- 内部类访问局部变量的时候,为什么变量必须加上final修饰
- 为什么C++赋值运算符重载函数不能被继承? 【转】
- 抽象方法不能为private,final或者static,为什么?
- JAVA为什么子类继承父类方法之后,不能抛出比父类更多的异常?