【问题标题】:private static final fields私有静态最终字段
【发布时间】:2012-09-29 20:30:45
【问题描述】:

我只是想澄清一下。有什么区别 -

private static int STUDENT_AGE = 18; 

private static final int STUDENT_AGE = 18; 

在该领域内?

Jon Skeet 解释为“根本与特定实例无关”,好吧,我想我明白了。那么 final 在这种情况下到底做了什么?

下面的代码不起作用是因为学生年龄被分配为静态最终?这是否意味着根本无法覆盖默认年龄?那么是否可以创建指定年龄而不是默认年龄的构造函数?

private String myName;
private String myAddress;
private int myYearEnrolled;
private String myGender; 
private static final int STUDENT_AGE = 18; 

public Student(String name, String address, int year, String gender) {
    myName = name;
    myAddress = address;
    myYearEnrolled = year;
    myGender = gender; 
}

   public Student(int age)
{
     STUDENT_AGE = age; 
}

【问题讨论】:

  • Final 使其保持不变。一旦你声明了 final,你以后就不能再给它重新赋值了。
  • 可能我的问题还不够清楚。
  • @vandey 它与constant 不同,常量的值在编译时是已知的。
  • 我补充一下,不可以随便设置新值,不管是构造函数还是方法

标签: java field


【解决方案1】:

static 表示“与特定实例完全无关” - final 表示初始化后您无法更改此值,并且此值必须初始化。

finalstatic 的组合使您能够创建常量。不再以公共方式推荐这(完全可以,例如私有上下文中的幻数),因为它不是类型安全的。使用 Enum post java 1.5 或按照 Joshua Blochs Effective Java 和 this question 中的建议创建自己的类型安全枚举 pre java 1.5。

备注:大约一年后读到这篇文章,我想我需要强调的是,public static final 字段一般没有问题,只是命名常量应该使用enums 或其他类型安全的替代方案来实现.

【讨论】:

    【解决方案2】:

    一旦一个变量被声明为final,它的值就不能在以后改变。在您提供的代码示例中,声明了一个常量,用于定义特定活动的学生年龄。这可能意味着会有一个条件,对于某些活动,学生的年龄将与这个常数进行比较。如果学生的年龄大于 18 岁,那么只有他可以继续或不继续。

    【讨论】:

      【解决方案3】:
       private static final int STUDENT_AGE = 18;
      

      这是常量声明。您无法更改该值。

      private static int STUDENT_AGE = 18;
      

      这是一个静态声明,但不是常量。该值可以更改。

      【讨论】:

      • 它不是常量,区别在于常量的值在编译时是已知的。 Java 不支持常量,它通过使用 static final... 来模仿它
      • 虽然 Java 有 const 关键字,但它是保留的。 :(
      • 嗯,java 有枚举,它们是类固醇上的常量。然而,Java 缺乏对 constness 的支持。
      • so private static final int STUDENT_AGE = 18;意味着学生的年龄将永远是 18 岁,除非我知道“最终”是否正确?
      【解决方案4】:

      final变量只能初始化一次。

      【讨论】:

        【解决方案5】:

        字段上的final 修饰符表示该字段的值一旦初始化就不能修改。

        因此,您不能设置STUDENT_AGE = age;,除非它不是最终的。

        【讨论】:

          【解决方案6】:

          简单地说,修饰符 final 意味着它的 FINAL。一旦定义了值,您就不能更改它。

          根据您的要求,如果您想在未提供任何内容的情况下提供默认年龄,则只需删除变量 STUDENT_AGE 的 final 修饰符。就像@Quoi 所说的那样

          【讨论】:

            【解决方案7】:

            final static变量只能初始化一次,但不一定在声明的时候。但是一旦初始化,它的值就不能改变了。所以,你可以初始化你的final static变量,当时声明或静态块中。

            private static final int STUDENT_AGE = 20;
            

            private static final int STUDENT_AGE;
            static {
                  STUDENT_AGE = 20;
            }
            

            现在,static 变量(也称为class 变量)并不特定于任何实例。它在该类的所有实例之间共享..

            这样看,Static 变量在类第一次加载时被加载到内存中。这就是它被所有实例共享的原因。因此,任何实例对静态变量的任何更改都将反映到该类的所有其他实例(是的,您没看错。您也可以通过该类的实例变量访问static 变量。但是编译器最终会担心仅实际课程)

            【讨论】:

            • 初始化后不能给final变量赋值。在您的第二个示例中,STUDENT_AGE 被赋予默认值0(如果允许编译,则不会因为STUDENT_AGE = 20; 而导致。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-04
            • 2014-10-13
            • 1970-01-01
            • 2010-11-27
            • 2015-08-22
            • 2011-03-19
            相关资源
            最近更新 更多