我只是想澄清一下。有什么区别 -
private static int STUDENT_AGE = 18;
和
private static final int STUDENT_AGE = 18;
在该领域内?
以下代码不起作用是因为学生年龄被指定为静态最终?这是否意味着默认年龄根本无法覆盖?那么是否可以创建指定非默认年龄的构造函数?
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;
}
答案 0 :(得分:21)
static
表示“根本不与特定实例相关” - final
表示您无法在初始化后更改此值,并且必须初始化。
final
和static
的组合使您能够创建常量。这不再以公共方式推荐(完全可以用于私人环境中的魔术数字),因为它不是类型安全的。使用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
变量..但编译器最终只担心实际的课程)