• final 和 static之间的区别和联系


    关键字final和关键字static两者的含义并不相似,但是笔者常常使用一段时间后就会忘记它们之间的区别,因为它俩总是相伴着出现。当只出现其中一个时,就对其代表的含义不甚清晰了。故而特地将相关知识点记下,便于每次遗忘时查阅。

    final

    final关键字顾名思义代表“最后的”,意味着不能被更改。它的定义,可以概括地分为以下三点:

    1. 被final修饰的类不能被继承;
    2. 被final修饰的方法不能被重写;
    3. 被final修饰的变量不能被改变。注:引用类型的变量,引用不可变,但是引用所指向的内容是可变的

    如果一个方法被final修饰,那么在编译阶段,JVM会为其寻求内联,即相当于将该方法中的语句都添加到调用该方法的代码中,去除这个方法。函数的调用是需要一定的开销的:保护现场、建立堆栈、恢复现场等,对于一些代码量不大,又频繁调用的函数来说,时空的消耗都是很大的,所以内联有助于提升Java的效率。因此如果已经确定某一个方法不会被继承,就尽量用final来修饰。

    static

    static关键字同样可以用于修饰类、方法和变量,但它修饰的类只能是内部类,它所修饰的方法和变量可以称为“静态方法”、“静态变量”,也可以称为“类方法”、“类变量”,后一种称呼显然更贴近于它的实际含义。相对于“类方法”、“类变量”的是“实例方法”、“实例变量”,也就是没有用关键字static修饰的方法和变量。一个类可以有很多对象(实例),对于非静态变量,每个对象都拥有,而静态变量,则是所有对象共有。

    • 静态资源是独立于类而存在的,所有实例共享,在类初始化的时候加载;
    • 非静态资源是在new一个新对象的时候加载,即生成实例的时候。

    通过以上两点,可以得出:
    当类只进行了初始化,还未产生实例的时候,非静态资源是未被加载出来的,因而在静态方法中引用非静态资源是错误的
    当父类子类都存在静态资源和非静态资源的时候,new第一个子类对象时,调用资源的顺序是:父类静态资源 -> 子类静态资源 -> 父类构造函数 -> 子类构造函数。由于静态 资源初始化只需一次,new第二个子类对象时,调用资源的顺序就是 父类构造函数 -> 子类构造函数

    static final

    通常static final连用来表示常量,只需要有一份,类的所有对象都共享且不可被更改。如果只用final,则每个实例都需要存储该数据,且随着它的使用,内存不断地分配又释放。如果这个常量是一个随机生成的数据,那么每个对象创建时,它都需要随机生成一次,那么对象和对象之间,生成的数据不等,常量成了变量。

  • 相关阅读:
    【友晶科技Terasic】DE10_Standard_ADC LTC2308的若干问题解答(SPI)(一)
    【友晶科技Terasic】Modelsim 提示# ERROR: No extended dataflow license exists Instantiation of 'RAM' failed. The design unit was not found
    【友晶科技TERASIC】DE10_STANDARD_ADC LTC2308的代码理解
    【友晶科技Terasic】FMC定义 HPC、LPC、FMC+有什么区别 (VITA 57.1及VITA 57.4标准)
    【友晶科技TERASIC】DE10_STANDARD_ADC LTC2308的若干问题解答(SPI)(三)
    20220312:k8s如何搭建gogs+drone实现自动化部署cicd,yaml如何写?
    vue配置js公共文件
    判断数组中是否有空 —— lamda语句
    TypeScript+Angular2+Ionic2
    Css如何实现背景色透明或半透明但内容不透明
  • 原文地址:https://www.cnblogs.com/fanrenren/p/11886190.html
Copyright © 2020-2023  润新知