私有静态最终字段

时间:2012-10-09 13:31:36

标签: java field

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

private static int STUDENT_AGE = 18; 

private static final int STUDENT_AGE = 18; 

在该领域内?

Jon Skeet解释为“根本不与某个特定实例相关”,好吧我想我明白了。那么最终在这种情况下究竟做了什么呢?

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

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; 
}

7 个答案:

答案 0 :(得分:21)

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

finalstatic的组合使您能够创建常量。这不再以公共方式推荐(完全可以用于私人环境中的魔术数字),因为它不是类型安全的。使用Enum发布java 1.5或按照Joshua Blochs Effective Java和this问题中的建议创建自己的类型安全enum pre java 1.5。

备注:大约一年后阅读本文,我想我需要强调一般public static final字段没有任何问题,只是命名常量应该用enums或另一种安全的替代方案。

答案 1 :(得分:6)

声明变量final后,其值无法在以后更改。在您提供的代码示例中,声明了一个常量,用于定义特定活动的学生年龄。这可能意味着将存在某种活动的条件,即将学生的年龄与此常数进行比较。如果学生年龄大于18岁,那么只允许他继续学习。

答案 2 :(得分:3)

 private static final int STUDENT_AGE = 18;

这是不断声明。您无法更改该值。

private static int STUDENT_AGE = 18;

这是静态声明但不是常数。价值可以改变。

答案 3 :(得分:1)

final个变量只能初始化一次。

答案 4 :(得分:1)

字段上的final修饰符表示初始化后字段的值无法修改。

因此,除非是非最终版,否则无法设置STUDENT_AGE = age;

答案 5 :(得分:1)

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

根据您的要求,如果您想提供默认年龄,如果没有提供任何内容,则只需删除变量STUDENT_AGE的最终修饰符。正是@Quoi所说的

答案 6 :(得分:0)

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变量..但编译器最终只担心实际的课程)