当通过对象访问时,静态最终字段和在声明时初始化的实例最终字段之间的差异

Ser*_*ero 5 java static final field constants

  • 第一个例子

    public class MyClass {
        final int x = 2;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    x

    1. final意味着在初始化之后永远不能设置它.
    2. 在声明处初始化,这意味着它以后不能为其分配不同的值(即使在构造函数中).
    3. 修复(不管实例)因为它的值不能在构造函数中(或其他任何地方)更改.
  • 第二个例子

    public class MyOtherClass {
        static final int x = 3;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    x

    1. final意味着在初始化之后永远不能设置它.
    2. 在声明处初始化,这意味着它以后不能为其分配不同的值.
    3. 一个静态字段和值将始终保持不变,不管实例.
    4. 不变,因为它既是静态的也是最终的.

我的问题是

两者有什么不同?(不包括创作时间)

我错过了什么吗?

Ste*_*n C 6

xin MyClass和之间的区别MyOtherClass是:

  • 第一个只能通过MyClass实例访问,并且可以有常量的多个副本.

  • 第二个可以在没有MyOtherClass实例的情况下访问,只能存在一个副本.

在您的示例中,具有常量的一个或多个实例之间没有实际差异1.但考虑一下:

public class YetAnotherClass {
    final int x;

    public YetAnotherClass(int x) {
        this.x = x;
    }
}
Run Code Online (Sandbox Code Playgroud)

...显示实例常量在不同实例中如何具有不同的值.


1 - 这是夸大其辞.首先,static final int x = 3;声明一个编译时常量,并且可以在switch case表达式中使用编译时常量,其中非编译时常量不能.其次,常量的非静态版本将占用每个实例中的空间MyClass.最后,如果你足够愚蠢地尝试使用反射来改变常量,那么行为会有所不同.(只是不要这样做......)