【问题标题】:Difference between a final variable and a constant? [duplicate]最终变量和常量之间的区别? [复制]
【发布时间】:2020-06-23 11:50:31
【问题描述】:

我是学习 Java 的新手,目前正在引入做 switch/case 构造。我正在阅读的书使用以下示例:

int eingabe = 256; 
final byte einKleinesByte = 2; 
final char einKleinerCharacter = 'c'; 
final short einKleinesShort = 500; 
switch(eingabe) {
case einKleinesByte: 
case einKleinerCharacter: 
case einKleinesShort: 

解释是这3个常量是在关键字final的帮助下定义的,这是必不可少的,因为变量不能用于case。

我的问题是,final byte einKleinesByte = 2; 和 byte EIN_KLEINES_BYTE = 2; 都被定义为常量有什么区别?

感谢您的帮助!

【问题讨论】:

  • 如果你定义如下: byte EIN_KLEINES_BYTE = 2; - 它不是恒定的。只有关键字final才能使其保持不变
  • byte EIN_KLEINES_BYTE = 2,你的意思是static final byte EIN_KLEINES_BYTE = 2吗?
  • Thinking in Java (Fourth Edition) > Java 的 final 关键字的含义根据上下文的不同而略有不同,但总的来说它表示“无法更改”。 > > 常量之所以有用有两个原因: > 1. 它可以是一个永远不会改变的编译时常量。 > 2. 它可以是在运行时初始化的值,您不想更改。

标签: java constants final


【解决方案1】:

final 变量和常量(static 和 final)之间的主要区别在于,如果您创建一个没有 static 关键字的 final 变量,尽管它的值是不可修改的,但每次创建一个变量时都会创建一个单独的副本新对象。常量是不可修改的并且在整个程序中只有一个副本。

【讨论】:

  • 不完全。它只是意味着“常数”将存在于较小的范围内。此外,仅仅因为一个变量被声明为 final,并不意味着你不能改变它的值。
  • @Stultuske “常量是不可修改的并且在整个程序中只有一个副本。” - 你指的是静态和最终,对吧?因此,如果我理解正确:如果创建多个对象,最终 = 多个副本是可能的。它们是否都具有相同的值,或者不同对象的值是否不同? static final = 只有一个常量存在,值不能改变
  • 我就是这个意思?
  • Ups,是的,标记了错误的用户...这很好:-D 谢谢你们!
  • 最后一件事——如果创建了多个实体,最终变量的值会不同吗?
【解决方案2】:

它们不是都定义为常量。您可以轻松更改byte EIN_KLEINES_BYTE 的值。您正在使用通常用于定义常量的蛇大写标准,但实际上,没有什么可以阻止您更改此变量的值。只有 keyworld final 会阻止这种情况。

// would work fine
int MY_CONSTANT = 2;
MY_CONSTANT = 3

// Will throw an error
final int myConstant = 2;
myConstant = 3

// recommended 
static final int MY_CONSTANT = 2

【讨论】:

    【解决方案3】:

    byte EIN_KLEINES_BYTE 不是常量,可以覆盖。

    final byte EIN_KLEINES_BYTE 不可能,那是一个常数。

    不能重新分配最终变量。对于原始类型或不可更改的类型,这意味着它们的值是恒定的。 对于大多数对象,它不是。您可以更改这些对象的状态(值),但不能将对象本身更改为另一个对象。

    仅将变量名大写,并不能使其成为常量。

    编辑:如果您希望整个应用程序的最终变量相同,您也必须将其声明为静态。

    【讨论】:

    • 我想,她真正想问的是final byte einKleinesByte = 2(定义为本地变量)和static final EIN_KLEINES_BYTE = 2之间的区别是什么。
    • @ZhekaKozlov 检查问题的最后一句,静态-非静态不是问题的意思
    • 问题是关于常量,而不是关于类字段访问
    • 我把所有大写字母 (EIN_KLEINES_BYTE) 的 java 约定弄错了,以便能够定义一个常量值(脸红)。我才刚开始,所以我还没有上课和上课等:-)
    • @ZhekaKozlov 关键字static 在这里完全无关紧要。 final byte einKleinesByte = 2;,定义为局部变量,仍然是编译时常量。这就是为什么它被允许在 switch 语句中作为 case 标签,就像在 OP 的代码中一样,也可以在注释中,以命名另一个重要的情况。相反,如果没有 final 关键字,即使您将其声明为 static 变量,它也不是。
    【解决方案4】:

    final 只是表示该值一旦分配就不能更改或重新分配

    关于常量,我建议您参考this question

    【讨论】:

    • 请记住,对于大多数对象,值可以更改,即使它被声明为 final
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多