【问题标题】:final and static in JavaJava中的最终和静态
【发布时间】:2021-01-02 05:56:42
【问题描述】:

我在书中读过这句话,但我不明白:

一个既是静态又是最终的字段只有一个不能更改的存储。

谁能帮我解释一下?

【问题讨论】:

标签: java


【解决方案1】:

你困惑的根源可能是英文中的“static”这个词和它在Java中的含义只是松散的相关。

以“正常”方式在 Cat 类中定义的变量可以称为实例变量。

class Cat {
   int weight;
}

每次创建 Cat 类型的新对象时,都会创建变量“weight”的新副本。如果您创建 10 个 Cat 类型的对象,每个对象都有自己的权重变量副本。

“静态”变量可以被认为是类级别的变量,而不是实例变量。静态变量只有一个副本并且属于 Cat 类本身,而不是 Cat 类型的 每个 对象都有一个副本。

class Cat {
   static String speciesName;

   int weight;
}

这里,无论我们创建多少 Cat 类型的对象,都只有一个 speciesName 副本。

如果静态变量也是“最终的”,则该变量的这一副本是唯一不能更改的存储部分。如果在上面的示例中变量“权重”是最终的,那么将有 10 个无法更改的存储块——我们创建的每个 Cat 类型的对象都有一个。

【讨论】:

  • 我知道这是旧的,但我只想提供迄今为止最简单的解释,真的帮助我理解这一点。 +1
  • 很好地解释了静态 VS 普通变量谢谢。
【解决方案2】:

static 变量对于类的所有实例都是通用的。 final 变量在第一次设置后无法更改。

所以Java中的static final变量对于类的所有实例都是通用的,并且在第一次设置后就无法更改。

class Car {

    static final int numberOfWheels = 4;
    Color color;

    public Car(Color color) {
        this.color = color;
    }
}

Car redCar = new Car(Red);
Car blueCar = new Car(Blue);

现在每辆车都有一个单独的可变属性color,它们共享属性numberOfWheels,该属性无法更改。

【讨论】:

  • @Jonas:我会犹豫将final 变量称为“常量”,因为该术语通常用于编译时变量或声明时分配的变量。相反,我会将final 变量描述为只能分配一次的变量(对于类成员,这需要在构造函数中)。
  • @Brian 我没有看到原来的措辞,但最终变量很像 Java 中的常量。它们以#define 的方式编译成代码,并由此产生一些有趣的副作用(例如更改#define 并仅重新编译该类不会更新其他类中的值——它们将编译原始值在)。你对“常数”有什么不同的定义?
  • @Bill K:这很有趣,我不知道。 Oracle/Sun 还在Java Tutorials 上为 Constants 调用类变量
  • @Bill K:我同意static final 变量实际上是一个常量。但是,Jonas 的答案的原始措辞将 final 变量称为常量,我不认为这是一个准确的措辞选择,因为类的不同实例对于最终变量可能具有不同的值。
  • @Jonas 实际上,您引用的那个页面非常准确。它没有说类变量是常量,它对常量的说法是:“静态修饰符与 final 修饰符一起用于定义常量。”并继续将传统的“编译时”常量与运行时计算的常量区分开来。
【解决方案3】:

有关此页面的说明,请参阅“常量”部分:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

【讨论】:

    【解决方案4】:
    • Final 表示不能为任何变量重新赋值
    • 静态表示所有方法的类中只能有一个引用副本。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 2015-08-02
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2019-04-14
      相关资源
      最近更新 更多