首页 > 其他分享 >知识回顾——final关键字

知识回顾——final关键字

时间:2023-04-06 20:11:48浏览次数:42  
标签:回顾 初值 class public 关键字 static 修饰 final

一.什么时候使用final关键字

  1.被final修饰的类不能被继承,所以当我们希望某类不能被继承时,就是用final修饰此类。

  2.当不希望父类的某个方法不被子类覆写(Override),可以用final修饰此方法。

  3.当不希望类的某个属性的值被修改,可以用final修饰。

  4.当不希望某个局部变量被修改,可以用final修饰,变为局部常量。

二.final使用注意事项和细节讨论

  1.final修饰的属性又叫常量,一般使用XX_XX_XX命名。

  2.final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以加在如下位置之一:

    1)定义时:如 public final double TAX_RATE = 0.08;

    2)在构造器中

    3)在代码块中

class Dog{
    //定义时赋初值
    public final String NAME1 = "name1";
    public final String NAME2;
    public final String NAME3;
    
    //构造方法中赋初值
    public Dog(){
        NAME2 = "name2";
    }

    //代码块中赋初值
    {
        NAME3 = "name3";
    }
}

  3.如果final修饰的属性是静态的,则初始化的位置只能是:

    1)定义时

    2)在静态代码块

    不能在构造器中赋值。

class fish{
    //定义时赋初值
    public static final int AGE1 = 11;
    public static final int AGE2;
    
    //静态代码块中赋初值
    static{
        AGE2 = 12;
    }
}

    为什么final修饰的属性是静态的,只能在定义时和静态代码块中赋初值,而不能在构造方法中赋初值?

    因为在类加载的时候,被static修饰的属性、方法和代码块就会初始化,而类加载时不会调用构造方法,如果被final修饰的静态属性可以在构造方法中赋初值,就会导致类加载时该属性没有初值,这与final“必须赋初值”是冲突的。

  4.final类不能继承,但是可以实例化对象。

  5.如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承,仍然遵守继承机制。

class BB{
    public final void test(){
        System.out.println("我是父类被final修饰的方法");
    }
}

class CC extends BB{

}

public class final_test {
    public static void main(String[] args) {
    CC c = new CC();
    c.test();//输出“我是父类被final修饰的方法”
    }
}

   6.一般来说,如果一个类已经是final类了,就没有必要再将其中的方法修饰为final方法了。因为一个方法加final的目的就是为了让继承类不能再重写此方法,如果类上加了final,代表此类不能被继承,继承都不能继承了,何谈其中的方法被重写?多此一举。

   7.final不能修饰构造方法(构造器)。

   8.final和static往往搭配使用,效率更高,不会导致类加载,底层编译期做了优化。

    什么意思?请看代码:

public class final_test_02 {
    public static void main(String[] args) {
        System.out.println(DD.num);
  } } class DD{
  //static和final不连用的情况:
public static int num = 999; static{ System.out.println("我是DD中static代码块中的输出语句"); } }

    输出:

      我是DD中static代码块中的输出语句
      999

public class final_test_02 {
    public static void main(String[] args) {
        System.out.println(DD.num);
  }
}

class DD{
  //static和final不连用的情况:
    public static int NUM = 999;
    static{
        System.out.println("我是DD中static代码块中的输出语句");
    }
}

    输出:

      999

    当我们不将static和final连用时,若想直接调用num属性,需要先加载类,而类加载时就会加载静态属性、方法和代码块,所以static代码块中的输出语句也会一并输出。

    而将static和final连用时,若想直接调用NUM属性,不会发生类加载,只会拿出NUM属性,所以只输出999。

   

    9.包装类(Integer、Double、Float、Boolean、String等)是final类,被final修饰,不能被继承。

   

标签:回顾,初值,class,public,关键字,static,修饰,final
From: https://www.cnblogs.com/Noob-Green-Hand/p/17294009.html

相关文章

  • static关键字,main方法,代码块,final关键字
    static关键字,main()方法,代码块,final关键字static关键字的使用:static:静态的static可以修饰:属性、方法、代码块、内部类使用static修饰的变量:静态变量(类变量)3.1属性:实例变量:我们创建了多个类的对象,每个对象都拥有一套独立的类的非静态属性,当修改其中一个对象的非静......
  • 序列化与transient关键字
    什么是序列化?看到别人说的感觉非常的好。简单来说,我们把对象从内存中变成可存储或传输的过程称之为序列化。 为什么要用序列化?简单来说,我们把对象从内存中变成可存储或传输的过程称之为序列化。 序列化的应用1)将数据转换成二进制流的形式,用于数......
  • SQL语句的其他关键字
    目录数据准备编写SQL语句小技巧查询关键字之where筛选查询关键字之groupby分组查询关键字之having过滤查询关键字之distinct去重查询关键字之orderby排序查询关键字之limit分页查询关键字之regexp正则表达式多表查询的思路数据准备#数据准备createtableemp(idintpri......
  • super关键字
    super关键字基本介绍super代表父类的引用,可以引用方法,属性以及构造器基本语法访问父类的属性,但不能访问private属性,案例:super.属性名;访问父类的方法,但不能访问private方法,案例:super.方法名(参数列表);访问父类的构造器,super.(参数列表);super带来的便利/细节调用父类构......
  • super关键字
    super关键字基本介绍super代表父类的引用,可以引用方法,属性以及构造器基本语法访问父类的属性,但不能访问private属性,案例:super.属性名;访问父类的方法,但不能访问private方法,案例:super.方法名(参数列表);访问父类的构造器,super.(参数列表);super带来的便利/细节调用父类构......
  • 马哥课程回顾-----pod
      kubectlapply-fpod1.yamlkubectlgetpod  kubectlexec-itpod1-ctestpod-dev--/bin/bash  //pod1是本实验的Pod名称,testpod-dev是本实验pod1中的容器名称,该docker容器部署了nginx  查看pod详情  查看pod日志: ......
  • 马哥课程回顾-----replicationcontroller
      实际工作中,很少单独操作Pod的,之所以k8s能够“自愈”,就是通过rc(ReplicationController)、rs(ReplicaSet)、Deployment等这些组件,再加上k8s核心controller工作机制来实现的。     扩容和缩容kubectlscalereplicationcontrollerrc-test--replicas=1     /......
  • 1688关键字搜索新品数据API接口(item_search_new-按关键字搜索新品数据)
    1688关键字搜索新品数据API接口(item_search_new-按关键字搜索新品数据)代码接口教程如下:公共参数名称类型必须描述key String 是 调用key(必须以GET方式拼接在URL中)secret String 是 调用密钥api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search......
  • 自动化测试当中的三大设计技巧:PO设计思想,数据驱动及关键字驱动
    大家好,我是洋子。当我们以离线脚本的形式编写了大量的自动化测试代码后,很容易发现以下常见问题:(1)对于UI自动化,当UI层的元素发生改变,需要修改所有相关的case,工作量巨大(2)代码难以扩展,每次想新增一个自动化case就要写新的逻辑,补充新的代码(3)代码可读性差,代码冗余,存在大量重复代码或者......
  • 马哥课程回顾----deployment
    原来k8s与docker对结通过CRI----》dockershim ---->docker daemonkubelet: 1、cri-docker ----->docker CE(daemon) 2、containerd(是docker捐献给CNNF云原生组织的)dokcer容器4个组件dockerDaemon 守护进程containerd -->CNNFdockershim  ru......