当前位置:   article > 正文

java final关键字 详解_java关键字final

java关键字final

目录

一、概述 :

二、作用 :

三、细节 :

        1.关于成员常量和局部常量的初始化问题 :

        2.关于“画蛇添足,冠上加冠”:

        3.关于常见的final类:

        4.关于静态常量和公有静态常量:

四、演示 :

        1.演示Ⅰ——final修饰类的演示

        2.演示Ⅱ——final修饰方法的演示

        3.演示Ⅱ——final修饰变量的演示(常量的初始化)

五、总结 :


一、概述 :

        final [ˈ faɪnl],最终的,最后的,决定性的,不可改变的。final作为Java中的一个关键字可以用来修饰方法,和变量。(但final不能修饰构造器!)


二、作用 :

①修饰类——
         被final修饰的类不能被继承,但该类可以去继承别的 (没有被final修饰的 )类,例如String类和System类,它们被final修饰,是不可以被继承的,但是它们有自己的父类——即顶层父类Object类。还有一点需要注意: 被final修饰的类虽然不能被继承,但 可以被实例化,即我们可以创建该类对象
②修饰方法——
         被final修饰的方法不能被子类重写,但可以被子类继承并使用(在满足访问权限规则的前提下)。注意,修饰方法时, final关键字不能与abstract关键字共存;因为我们前面在学习抽象类时说过,abstract修饰的方法是必须被非抽象子类重写的。
③修饰变量——
        这里修饰的”变量“其实又可以细分为成员变量和局部变量 被final修饰的变量称为最终变量,即常量——成员常量和局部常量常量只能赋值一次,不能被二次更改
        关于 常量的命名,我们在Java 命名规范中已经说过,一般来说,常量名所有字母都大写,多个单词之间用下划线隔开。eg : MAX_VALUE(最大值)。
        若final关键字修饰的是一个引用类型变量,则该引用指向的地址值无法改变。(相当于一个 固定指针)PS : 但是,我们不建议使用final修饰引用类型数据,因为通过引用,仍然可以修改堆空间中真正的对象的内部数据,从这个角度来看实际意义并不大。

三、细节 :

        1.关于成员常量和局部常量的初始化问题 :

        当final修饰的是成员变量,即final修饰属性时。该成员常量必须进行初始化。要么就在定义成员常量时对它赋初值来显式初始化;如果在定义成员常量时没有赋初值——那么要么在构造器中进行初始化;要么在代码块中进行初始化。

        而对于final修饰的局部变量,即局部常量——局部常量如果未被使用,可以不赋初值;但如果局部常量被调用了,就必须赋初值。

        2.关于“画蛇添足,冠上加冠”:

        一般地,如果一个类已经被final关键字修饰,那么从逻辑上讲,该类中的方法是没有必要再次用final修饰的。这是因为用final修饰方法的目的就是为了不让该方法被子类重写;而final修饰的类本身就已经不能被继承了,又谈何重写呢?

        3.关于常见的final类:

        除了上文中提到的String类和System类,还有哪些类是被final关键字修饰的呢?Java中所有的包装类都被final关键字修饰了。也就是说,所有的包装类都不能被继承

        包装类包括了Byte, Short, Integer, Long, Character, Float, Double, Boolean共八种,其实就是Java中八种基本类型对应的引用类型。(关于包装类,我们在讲到下一专题内容[ API-常用类 ]时会专门出一篇博文,这里大家先了解一下即可。)

        4.关于静态常量和公有静态常量:

        静态常量指的是static和final共同修饰的变量。因为用到了static关键字的知识,所以相关内容up放在了static关键字的万字详解篇,大家可以看完这篇博文后再返回来,点击链接跳转进去查看,里面有目录,直接找到"公有静态常量"和"公有静态常量的演示"即可。


四、演示 :

        1.演示Ⅰ——final修饰类的演示

        up以Fruit类和Grape类为栗,当我们用final修饰Fruit类时,Fruit类将无法被Grape类继承。如下GIF演示动图 :


        2.演示Ⅱ——final修饰方法的演示

        up仍然以Fruit类和Grape类为栗,增加Test类作为测试类。在Furit中定义一个juice(榨果汁)方法,并且在子类Grape中重写该方法。
        Fruit类,Grape类,Test类代码如下 :

  1. package knowledge.polymorphism.about_final.demonstration;
  2. public class Fruit {
  3. private String fruit_name;
  4. public String getFruit_name() {
  5. return fruit_name;
  6. }
  7. public void setFruit_name(String fruit_name) {
  8. this.fruit_name = fruit_name;
  9. }
  10. public void juice() {
  11. System.out.println(getFruit_name() + "可以榨果汁儿!");
  12. }
  13. }
  14. class Grape extends Fruit {
  15. @Override
  16. public void juice() {
  17. System.out.println(getFruit_name() + "可以榨葡萄汁儿!");
  18. }
  19. }
  20. class Test {
  21. public static void main(String[] args) {
  22. Fruit fruit = new Grape();
  23. fruit.setFruit_name("葡萄
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/574249
    推荐阅读
    相关标签