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

标签 java static field constants final

<分区>

  • 第一个例子

    public class MyClass {
        final int x = 2;
    }
    

    x

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

    public class MyOtherClass {
        static final int x = 3;
    }
    

    x

    1. final 这意味着它在初始化后永远无法设置。
    2. 在声明时初始化,这意味着以后不能为其分配不同的值。
    3. static 字段和值将始终保持不变,无论实例如何。
    4. constant 因为它既是static 又是final

我的问题是

两者有什么区别? (不含创建时间)

我错过了什么吗?

最佳答案

MyClassMyOtherClassx的区别是:

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

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

在您的示例中,具有一个或多个常量实例之间没有实际区别1。但是考虑一下:

public class YetAnotherClass {
    final int x;

    public YetAnotherClass(int x) {
        this.x = x;
    }
}

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


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

关于java - 通过对象访问时静态最终字段和在声明时初始化的实例最终字段之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31502184/

相关文章:

java - 如何在 Linux 上用 Java 命名调用目录?

java - Android 以像素为单位的定位可以工作,但不应该

java - 是否可以使用 Gson 实例作为模型 bean 中的静态字段(重用)?

java - jsp中如何访问静态 boolean 变量

json - Jackson 中的过滤字段和子字段

java - 由于没有互联网连接而无法打开 url 时的 android 事件

java - 从子类对象使用父类(super class)的 getClass 方法

c++ - 持久类变量

java - 如何将字段名称应用于 ArrayList,然后向该 ArrayList 添加内容

Mysql查询: selecting from two rows in the same field