14

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

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

7 回答 7

23

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

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

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

于 2012-10-09T13:33:53.183 回答
7

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

于 2012-10-09T13:50:24.210 回答
4
 private static final int STUDENT_AGE = 18;

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

private static int STUDENT_AGE = 18;

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

于 2012-10-09T13:34:33.717 回答
1

final变量只能初始化一次。

于 2012-10-09T13:32:44.273 回答
1

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

STUDENT_AGE = age;因此,除非它是非最终的,否则您无法设置。

于 2012-10-09T13:33:02.463 回答
1

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

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

于 2012-10-09T13:34:32.000 回答
-1

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通过类的实例变量访问变量。但是编译器最终会担心实际的类只要)

于 2012-10-09T13:59:46.463 回答