final 与 static 的区别?

final 与 static 的区别?

一、含义和作用

  1. final
    • 表示最终的、不可改变的。
    • 用于修饰变量时,该变量成为常量,其值不能被修改。
    • 用于修饰方法时,该方法不能被重写
    • 用于修饰时,该类不能被继承
  2. static
    • 表示静态的,与类相关而不是与类的实例相关。
    • 用于修饰变量时,该变量为类变量,所有的实例共享这个变量。
    • 用于修饰方法时,该方法为类方法,可以直接通过类名调用,而不需要创建类的实例。

二、存储位置和生命周期

  1. final修饰的变量:
    • 如果是基本数据类型,其值存储在中或常量池中,具体取决于变量的声明位置和初始化方式。一旦初始化,其值在整个程序执行过程中保持不变。
    • 如果是引用类型,其引用存储在中,指向的对象存储在中。但该引用不能再指向其他对象。
  2. static修饰的变量:
    • 存储在方法区中,与类的生命周期相同,即从类被加载到内存中开始,到类被卸载为止。

三、使用场景

  1. final:

    • 当你希望一个变量的值在初始化后不能被改变,或者一个方法不能被重写,或者一个类不能被继承时,可以使用final。
      • 例如,定义常量、防止方法被意外重写以确保特定的行为、或者设计不可扩展的类。
      • 例如,定义数学常量PI可以使用final double PI = 3.14159;
  2. static:

    • 当你希望一个变量或方法与类本身相关而不是与特定的实例相关时,可以使用static。
      • 例如,工具类中的方法通常是静态的,因为它们不需要创建类的实例就可以使用。
      • 例如,Math类中的方法都是静态的,如Math.sqrt()用于计算平方根,不需要创建Math类的实例就可以直接调用。

总结

可变性继承与重写访问方式内存分配
final定义不可变的变量不能被继承和重写变量、方法和类可以通过对象实例或类名访问(取决于它们的访问修饰符)分配在堆(对象实例)或栈(局部变量)上
static与可变性无关,它定义的是类的共享成员不能被重写,但可以被子类隐藏通过类名访问,不需要创建对象实例存储在方法区中,只有一份
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值