• final----这篇文章是我收获很大


      

    final 用于声明属性、方法和类,分别表示属性不可变,方法不可重写,类不可继承。

    【转】Java final 修饰符知识点总结

    final从字面上理解含义为“最后的,最终的”。在Java中也同样表示出此种含义。

    final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

    1. final修饰类:

    final修饰类即表示此类已经是“最后的、最终的”含义。因此,用final修饰的类不能被继承,即不能拥有自己的子类。

    如果视图对一个已经用final修饰的类进行继承,在编译期间或发生错误。

     

    2. final修饰方法:

    final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。

    此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,

    将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是

    在子类中重新定义了新的方法。

     1 public class B extends A {
     2 
     3     public static void main(String[] args) {
     4 
     5     }
     6 
     7     public void getName() {
     8         
     9     }
    10 }
    11 
    12 class A {
    13 
    14     /**
    15      * 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
    16      * 属于子类本身的方法,编译正常
    17      */
    18     private final void getName() {
    19         
    20     }
    21 
    22     /* 因为pblic修饰,子类可以继承到此方法,导致重写了父类的final方法,编译出错
    23     public final void getName() {
    24     
    25     }
    26     */
    27 }

     

    3. final 修饰变量:

    final修饰的变量表示此变量是“最后的、最终的”含义。一旦定义了final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。

    这里需要注意以下几个问题:

    1. final修饰的变量,无论是类属性、对象属性、形参还是局部变量,这些变量都是需要进行显示初始化(即为其显示指定初始值)。

    对于final修饰的形参,由于是实参传递过来的,很好理解。

    对于final修饰的局部变量,与未用final修饰的变量一样,都是需要显示初始化。即局部变量都是需要显示初始化的。

    对于一般的类属性和对象属性,由类和对象的初始化过程中可以看出,首先都进行了默认初始化。然后对有显示赋值的变量才再进行显示初始化。

    但对final修饰的类属性和对象属性而言,如果不显示初始化,其默认将是进行默认初始化后的值,这与final本身出发点矛盾,因此,Java语法规定:

    final修饰的类属性和变量属性必须要进行显示初始化赋值。

    另外,无论对于基本数据类型还是引用数据类型,final修饰的变量都是首次显示初始化后值都不能修改。对于基本数据类型,很好理解。对于引用

    数据类型,引用变量指向的是实际的对象,但其存储的是所指向对象的地址,因此,其值不能修改并不意味着其所指向的对象不能修改。

     

    4. final修饰变量后导致的“宏替换”/"宏变量"问题

    Java 中宏变量/宏替换指的是在java代码中在编译期某些变量能够直接被其本身的值所替换,编译到.class文件中。因此,编译后的.class文件中已经不存在此变了。

    在String类型的变量中,有时候经常遇到如下情况:

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4 
     5         String country = "China";
     6         String name = "qqyumidi";
     7 
     8         String userInfo = country + name;  //编译后此处依然是country和name变量
     9         String user = "China" + "qqyumidi";  //编译后此处直接变成Chinaqqyumidi
    10 
    11     }
    12 }

    在上述代码中的第9行,编译后的变量结果直接为Chinaqqyumidi。而第8行代码中,由于country和name都是普通的变量,编译器无法在编译时直接确定userInfo的值,因此

    此处编译后结果不直接是Chinaqqyumidi。

    但是,如果希望第8行中的代码在编译期直接就能表示为Chinaqqyumidi,就需要用到final修饰符对country和name变量进行修饰。

    原因:final修饰符修饰的变量在由于其本身的特性,在编译期就能直接确定其值,且此值不可变。在编译过程中,可以直接将其变量直接转换成其值本身去表示。

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4 
     5         final String country = "China";
     6         final String name = "qqyumidi";
     7 
     8         String userInfo = country + name;  //编译后此处直接是Chianqqyumidi
     9 
    10     }
    11 }

     又这篇文章我拓展开了这些问题

    java问题:类的定义,对象的定义?

    java 函数形参传值和传引用的区别

    基本数据类型跟引用数据数据类型的区别

    ---- 动动手指关注我!或许下次你又能在我这里找到你需要的答案!ZZZZW与你一起学习,一起进步!
  • 相关阅读:
    2019牛客暑期多校赛(第四场)
    单调栈求左右第一个比该数大(小)的位置
    带修莫队板子
    普通莫队算法
    2019牛客暑期多校赛(第三场)B-求01串中的最长01数量相等的子串和子序列
    2019牛客暑假多校赛(第二场) F和H(单调栈)
    网络文件系统nfs
    rsync详解
    逻辑卷LVM
    crontab定时任务
  • 原文地址:https://www.cnblogs.com/zzzzw/p/4964963.html
Copyright © 2020-2023  润新知