路上的小渣渣 2019-02-16 15:27 采纳率: 0%
浏览 255

疯狂java讲义第六章 6.4节FinalErrorTest疑问

书中讲:java不会对final修饰的成员变量隐式初始化,要求作者显示初始化。但
是在后面的例子中,变量age还未初始化之前直接用输出语句输出age编译报错,
而用类中定义的函数printAge()就不报错。实质还是同一个操作,这作何解释?
代码如下,求各路大神解答,感激不尽。


public class FinalError
{
    // 定义一个final修饰的实例变量
    // 系统不会对final成员变量进行默认初始化
    final int age;
    {
        //这里对未赋值的age直接输出报错
        //System.out.println(age);
        //这里用函数去调用输出就不报错
        printAge();
        age = 6;
        System.out.println(age);
    }
    public void printAge(){
        System.out.println(age);
    }
    public static void main(String[] args)
    {
        new FinalError();
    }
}

  • 写回答

1条回答 默认 最新

  • 真-酸辣土豆丝 2019-02-18 11:31
    关注

    直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。这个直接一对大括号中间的代码称为构造代码块。其中的代码是优先于构造函数的,所以那时还没有对属性初始化值。int的初始化值是0

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置