深入理解final变量的初始化

 更新时间:2013年06月04日 16:47:21   作者:  
本篇文章是对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也是,普通代码块的加载要晚于静态变量,所以也是不行的。

相关文章

  • MyBatis中#{}和${}的区别详解

    MyBatis中#{}和${}的区别详解

    mybatis和ibatis总体来讲都差不多的。下面小编给大家探讨下mybatis中#{}和${}的区别,感兴趣的朋友一起学习吧
    2016-08-08
  • java 栈和堆区别详细介绍

    java 栈和堆区别详细介绍

    这篇文章主要介绍了java 栈和堆区别详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12
  • 创建Spring Boot项目的几种方式总结(推荐)

    创建Spring Boot项目的几种方式总结(推荐)

    这篇文章主要介绍了创建Spring Boot项目的几种方式总结(推荐),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java7到Java17之Switch语句进化史示例详解

    Java7到Java17之Switch语句进化史示例详解

    这篇文章主要为大家介绍了Java7到Java17之Switch语句进化史示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 学习Java设计模式之观察者模式

    学习Java设计模式之观察者模式

    这篇文章主要为大家介绍了Java设计模式中的观察者模式,对Java设计模式感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 使用fastjson中的JSONPath处理json数据的方法

    使用fastjson中的JSONPath处理json数据的方法

    这篇文章主要介绍了使用fastjson中的JSONPath处理json数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • log4j 详解异步日志的配置和测试

    log4j 详解异步日志的配置和测试

    这篇文章主要介绍了 log4j 详解异步日志的配置和测试的相关资料,需要的朋友可以参考下
    2017-01-01
  • 谈谈Java中自定义注解及使用场景

    谈谈Java中自定义注解及使用场景

    这篇文章主要介绍了谈谈Java中自定义注解及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询

    MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询

    本文主要介绍了MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • java selenium 操作浏览器实例

    java selenium 操作浏览器实例

    本文主要介绍java selenium 操作浏览器,这里整理了相关资料,并附示例代码,有需要的小伙伴可以参考下
    2016-08-08

最新评论