微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

深入理解final变量的初始化

本篇文章是对final变量的初始化进行了详细的分析介绍,需要的朋友参考下

final变量的初始化位置

一是其定义处,也就是说在final变量定义时直接给其赋值,

二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。

三是在初如化代码块中{} 或者static{}

复制代码 代码如下:

public class InitOrder {

    {

        System.out.println("before---field");

        //System.out.println("d1="+d1);

        d1 = 3;

        //System.out.println("d1="+d1);

    }

    static {

        System.out.println("before---static field");

        //System.out.println("d2="+d2);

        d2 = 3;

        //System.out.println("d2="+d2);

    }

    final int a1 = 1;

    final int b1;

    final int c1;

    final int d1;

    //final int e1;

    static final int a2 = 1;

    //static final int b2;

    static final int c2;

    static final int d2;

    //static final int e2;

    {

        System.out.println("after---field");

        //System.out.println("c1="+c1);

        c1 = 4;

        System.out.println("c1="+c1);

        //e2 =3;

    }

    static {

        System.out.println("after---static field");

        //System.out.println("c2="+c2);

        c2 = 4;

        System.out.println("c2="+c2);

        //e1 = 3;

    }

    public InitOrder() {

        b1 = 2;

        //b2 = 2;

    }

    public static void main(String[] args) {

        InitOrder order = new InitOrder();

        System.out.println("c1="+order.c1);

        System.out.println("c2="+order.c2);

        System.out.println("d1="+order.d1);

        System.out.println("d2="+order.d2);

    }

}

说明:上述所有注释皆为有语法错误

输出结果:

before---static field

after---static field

c2=4

before---field

after---field

c1=4

c1=4

c2=4

d1=3

d2=3

结果分析:

1. 对比a1,a2基本没有什么问题,定义时就初始化

2. 对比b1,b2在构造函数中初始化,b1没有问题,b2有问题,这是因为构造函数调用在静态变量的后面而b2是静态的,所以会报错

3. 对比c1,d1发现初始化没有问题,有问题的是使用输出语句。对于d1在初始化代码块中不论在哪加输出语句都会报错,这是因为d1所在的初始化代码块位置在变量d1定义的前面,而java中变量的初始化顺序是见Java中变量的初始化顺序,普通变量和初始化代码块的初始化顺序是按照位置的先后的所以输出用到了d1变量,所以出错,但有一点我不明白,为什么在这里初始化d1不报错,而且在main函数中还可以调用它,难道这个也要去看一下java虚拟机?对于c1在后面加输出语句没有问题。前面加有问题很好理解,就是大之前没有被初始化.

4. 对于c2,d2是和3同样的道理

5. 对于e1放在静态代码块中显然不行,因为静态代码块最先加载,那时e1还没有加

6. 对于e2也是,普通代码块的加载要晚于静态变量,所以也是不行的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐