最后一个概念说,如果它首先没有被合成,那么它会在调用它的函数中给出错误,并且最终的数据成员也可以从构造函数中获得,这被称为空白最终概念。
但最终的数据成员一旦分配就无法更改,但这里
public class Demo
{
final int w;
public Demo()
{
fun();
w=10;
}
public void fun()
{
System.out.println(w);
}
public static void main(String ... args)
{
Demo d=new Demo();
System.out.println(d.w);
}
}
这里的fun()中w的值是0 ..然后我将w指定为10,这样在主println中它现在是10 ...
所以我的问题很有趣()w显示值为0意味着它在堆中有一个空间作为对象,它的值是0,我已经用最终关键字锁定,所以它不应该进一步改变为什么w如果w的值已经在fun()中看到了,那么构造函数中的= 10没有给出任何错误...并且如果w的值在构造函数中可能会有所不同,那么当我确定w = 20之后它为什么显示错误w = 10在构造函数中。?
如果默认值可以用于最终变量那么为什么需要明确地分配它们??
答案 0 :(得分:1)
来自When are static variables are initialized?
“编译器实际上做的是在内部生成一个单独的类初始化例程,该例程将所有静态变量初始化程序和所有静态初始化程序代码块按它们在类声明中出现的顺序组合在一起。这个单一的初始化过程在第一次加载类时,它会自动运行一次。“
和Why aren't static final variables given default values?
“现在我们已经证明静态最终字段确实得到了默认值,你可能想知道为什么默认值不够。除了显而易见的问题之外,这个问题没有好的答案:”规范说所以“。摘录自8.3.1.2:
如果一个空的final(§4.12.4)类变量没有被声明它的类的静态初始化器(第7.7节)明确赋值(§16.8),那么这是一个编译时错误。
我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果要将变量设置为0,则可以更明确地执行此操作。“
答案 1 :(得分:0)
final int w;
你还没有开始它。
如果你有
final int w=5;
然后它会显示这个compilatino错误
The final field Demo.w cannot be assigned
一旦定义了最终值,就无法再次分配。
答案 2 :(得分:0)
所有字段都初始化为默认值。在您的情况下,最初w
设置为0
。这就是System.out.println()
打印0
。
您必须在构造函数的末尾为所有最终字段分配值。只有此时刻,其值才不应进一步变化。