深入理解final变量的初始化

所属分类: 软件编程 / java 阅读数: 99
收藏 0 赞 0 分享
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也是,普通代码块的加载要晚于静态变量,所以也是不行的。
更多精彩内容其他人还在看

Spring boot将配置属性注入到bean类中

本篇文章主要介绍了Spring boot将配置属性注入到bean类中,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Java正则判断日期格式是否正确的方法示例

这篇文章主要介绍了Java正则判断日期格式是否正确的方法,结合实例形式分析了Java针对日期字符串正则判断的相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

java Future 接口使用方法详解

这篇文章主要介绍了java Future 接口使用方法详解,Future接口是Java线程Future模式的实现,可以来进行异步计算的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java 读取外部资源的方法详解及实例代码

这篇文章主要介绍了Java 读取外部资源的方法详解及实例代码的相关资料,经常有读取外部资源的要求,如配置文件等等需要读取,需要的朋友可以参考下
收藏 0 赞 0 分享

Java正则表达式之split()方法实例详解

这篇文章主要介绍了Java正则表达式之split()方法,结合实例形式较为详细的分析了split方法的功能、使用方法及相关注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java 存储模型和共享对象详解

这篇文章主要介绍了Java 存储模型和共享对象详解的相关资料,对Java存储模型,可见性和安全发布的问题是起源于Java的存储结构及共享对象安全,需要的朋友可以参考下
收藏 0 赞 0 分享

Java使用正则表达式实现找出数字功能示例

这篇文章主要介绍了Java使用正则表达式实现找出数字功能,结合实例形式分析了Java针对数字的匹配查找及非数字替换操作相关实现技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring核心IoC和AOP的理解

本文主要介绍了Spring核心IoC和AOP的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
收藏 0 赞 0 分享

详解Spring AOP 拦截器的基本实现

本篇文章主要介绍了详解Spring AOP 拦截器的基本实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Mybatis 中的一对一,一对多,多对多的配置原则示例代码

这篇文章主要介绍了 Mybatis 中的一对一,一对多,多对多的配置原则示例代码,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多