为什么不能在静态变量中访问最终变量。 在编译时,它们只是直接替换为它们的值 所以,他们应该被允许甚至在静态方法中使用
为什么这个限制???
答案 0 :(得分:3)
static =在课堂上。
final =不会改变它的值(但如果它不是静态的,那么每个实例都是如此)。
例如,你可以这样做:
public class Weird
{
private static long number = System.getTimeInMilis();
private final long created = System.getTimeInMilis();
}
每次创建一个Weird对象时,它都会包含一个不同的值。
但Weird.number的值将是加载类的时间。
答案 1 :(得分:2)
并非所有final
变量都是编译时常量。编译器只能将static final
个变量替换为编译时常量。在某些情况下,final
修饰符仅用于确保const-correctness。
并且static
方法无法访问非静态变量,因为这些变量对于同一类的不同实例可以具有不同的值。
答案 2 :(得分:1)
如果您问为什么static
方法无法访问final
实例变量(在[错误]假设最终成员变量始终设置为代码中的文字或常量值),因为类的不同实例可以对同一个final
实例变量具有不同的值(例如,可以通过构造函数设置)。 static
方法不知道该类的任何特定实例,并且只能访问static final
个变量。