常量
846字约3分钟
2025-09-23
final关键字
修饰变量的核心含义是:变量本身(存储的值或地址)不能被重新赋值
- 基本类型:值不可变(因为变量直接存值)。
- 引用类型:地址不可变(变量存的是地址),但对象 / 数组的内容可以变。
final表示的是最终的,最后的;所以顾名思义,final成员是不能被修改的
final修饰的属性叫做常量,常量的属性名则是用大写字母来表示,每个字母之间用下划线来隔开
public final double TAX_RATE = 0.08;
常量定义的值是不可以修改的;定义一个常量必须赋值,可以在定义时、构造器或则代码块中赋值,赋值之后就不能在修改常量的值了
public class Demo01 { public static void main(String[] args) { new A(); } } class A { /** 普通常量的三种赋值方式 */ // 在定义时赋值,这里已经定义好了值,所以这里的常量就不能修改 public final double TAX = 0.2; // 在构造器中赋值 public final double TAX1; public A() { TAX1 = 0.3; } // 普通常量则只能在普通方法块中赋值 // 静态代码块中不能给普通常量赋值 // 因为静态成员的优先级要高于普通成员 public final double TAX2; { TAX2 = 0.5; } }
上面说的是普通常量的赋值,接下来说静态常量的赋值,静态常量和普通常量的区别就是静态常量不能在构造器中赋值,且赋值的代码块则必须是静态代码块不能是普通代码块
public class Demo01 { public static void main(String[] args) { new A(); } } class A { /** 静态常量的两种赋值方式 */ // 在定义时赋值 public static final double TAX = 0.2; // 静态常量只能在静态方法块中赋值 public static final double TAX3; static { TAX3 = 0.5; } }
final类不能被继承,但是可以被创建
public class Demo01 { public static void main(String[] args) { // A类虽然是final类 // 虽然不能被继承,但是可以被创建对象 new A(); } } final class A { }
即使类中有final方法,但这并不影响别的类去继承本类
public class Demo01 { public static void main(String[] args) { // A类中虽然有final方法 // 但这并不影响别的类去继承A类 new A(); // 虽然final方法不能被重写,但是可以被调用 A.inf(); } } class A { // final方法不能被重写 public final static void inf() { } } class B extends A { }
final和static搭配不会导致类被加载
public class Demo01 { public static void main(String[] args) { // final和static一起使用不会导致那个类被加载 System.out.println("a = " = A.num); } } class A { public final static int num = 10; // 静态代码块不会被加载 static { System.out.println("静态代码块已被调用"); } }
// 运行结果 a = 10
一个数组常量,该数组常量不能被新数组赋值,但是你可以修改数组中的数值
final double[] D = {1.1, 1.2, 1.3}; System.out.println(D.hashCode()); // 哈希值为 1163157884 // 可以修改数组中的元素 D[0] = 3.3; System.out.println(D.hashCode()); // 哈希值为 1163157884 // double[] E = {1.1, 2.2, 3.3}; // 但是不能替换数组常量 // D = E;