深入理解final变量的初始化

銏蜍叆祢啲纪鳦

銏蜍叆祢啲纪鳦

2016-02-19 09:26

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的深入理解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也是,普通代码块的加载要晚于静态变量,所以也是不行的。
展开更多 50%)
分享

猜你喜欢

深入理解final变量的初始化

编程语言 网络编程
深入理解final变量的初始化

java父类和子类初始化顺序的深入理解

编程语言 网络编程
java父类和子类初始化顺序的深入理解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

浅谈Java变量的初始化顺序详解

编程语言 网络编程
浅谈Java变量的初始化顺序详解

Java类变量和成员变量初始化过程的应用介绍

编程语言 网络编程
Java类变量和成员变量初始化过程的应用介绍

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入理解 ViewState

Web开发
深入理解 ViewState

深入理解sizeof

C语言教程 C语言函数
深入理解sizeof

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用js实现控制内容的向上向下滚动效果

用js实现控制内容的向上向下滚动效果

android开发之欢迎界面的小例子

android开发之欢迎界面的小例子
下拉加载更多内容 ↓